DHTML Newsfader

sh0x

Erfahrenes Mitglied
Javascript Newsfader: Kritisiert mich!

Ich habe mal einen Newsfader geschrieben, den man mit einigen Einstellungen anpassen kann.
Getestet unter Firefox 0.8, Internet Explorer 5.5, Netscape 4 und 7.1.
Da ich Einsteiger in Javascript bin, würde ich gerne von euch wissen, was ich am Code noch verbessern könnte, bzw. ein paar Tricks, die ich anwenden könnte.

Oder fallen euch Fehler auf, die unbedingt noch behoben werden müssen?

Alles, sei es positiv oder negativ, was euch auffällt, bitte ich mir zu schreiben.

@Moderator: Wenn der Ticker eine Bereicherung für die Community ist, würde ich mich bereiterklären, ein Tutorial zu schreiben. Kannst mir ja PN schreiben.

Beste Grüße :) ,
sh0x

Code:
// #########################################################################################################################	
		// Newsfader Beta Version 0.1
		// Autor : Bastian ******* aka sh0x
		// Datum: 15.04.2005
		//
		// +++ Einstellungen für den Ticker
	var A_Tickertext = new Array();
	A_Tickertext[0] = "Webseite wurde aktualisiert: News-Section nun vorhanden.";
	A_Tickertext[1] = "Grüne Frösche wurden gequält: Das Oberlandesgericht klagt!";
	A_Tickertext[2] = "Fans erwarteten es schon lange: Basti gewinnt Schönheitswettbewerb!";
	A_Tickertext[3] = "Morgen Pizza in der Kantine erhältlich...";
		
	var StartTag = "+++ "; // optionale Tags, wie z.B. +++ vor bzw. nach dem Content
	var EndTag = " +++";
	
	var newsschaltzeit = 3000; // Zeit, bis die nächsten News kommen
	var dimmschaltzeit = 20;   // Zeit in Millisek, mit der die Farbe gedimmt wird
	
	var r = 0; // Diese Werte geben die Farbe an, von der aus losgedimmt werden soll
	var g = 0;
	var b = 0;	
	
	var zielr = 255; // Diese Werte kennzeichnen die Farbe, zu der gedimmt werden soll
	var zielg = 255;
	var zielb = 255;	
	
	var faktor = 10; // Faktor gibt die Anzahl der Dimmschritte an
	
// Ab hier bitte nichts mehr ändern.
// #########################################################################################################################
		
		
		
		// Browsererkennung
		var ns4lay=(document.layers && navigator.appName.toLowerCase().indexOf('netscape')!=-1) ? 1 : 0; // wenn Layers vorhanden und netscape vorkommt ist es ns4
		var docall=document.all ? 1 : 0;
		var w3cdom=document.getElementById ? 1 : 0;
				
		//wichtige Zählervariablen:		
		var i=0; 	
		var j=0;		

		//Anlegen einer Kopie der Originalfarben	
		var kopier = r;
		var kopieg = g;
		var kopieb = b;
		
		//Berechnungen der Farbbereiche und der Schrittweite	
		var bereichr = (kopier - zielr > 0) ? kopier - zielr : zielr - kopier;
		var bereichg = (kopieg - zielg > 0) ? kopieg - zielg : zielg - kopieg;
		var bereichb = (kopieb - zielb > 0) ? kopieb - zielb : zielb - kopieb;		
		var schrittr = (bereichr/faktor);
		var schrittg = (bereichg/faktor);
		var schrittb = (bereichb/faktor);	
		
		function ZeitenPruefen() {
			if (dimmschaltzeit * faktor >=newsschaltzeit) {	
				return false;
			}
			return true;			
		}

		
		function FarbeSetzen() {
			kopier = r;
			kopieg = g;
			kopieb = b;	
		}
		
		
		function LieferObjekt(id) {
			if (w3cdom) {return document.getElementById(id);}
				else if (docall) {return document.all(id);}
					else if (ns4lay) {return eval('document.'+id);}
			return false;		
		}
		
		
		function SwitchText() {
		if (ZeitenPruefen()) {
			if (w3cdom || docall) {				
				LieferObjekt('bastiticker').style.color="rgb("+r+","+g+","+b+")";
				LieferObjekt('bastiticker').innerHTML=StartTag+A_Tickertext[i]+EndTag;
				FarbDimmen();				
				}
			else if (ns4lay) {
					LieferObjekt('bastiticker_ns').document.fscrollerns_sub.document.open();
					LieferObjekt('bastiticker_ns').document.fscrollerns_sub.document.clear();
					LieferObjekt('bastiticker_ns').document.fscrollerns_sub.document.write(StartTag+A_Tickertext[i]+EndTag);
					LieferObjekt('bastiticker_ns').document.fscrollerns_sub.document.close();
					}
			if (i<A_Tickertext.length-1) {i++;}
			else {i=0;}			
			setTimeout("SwitchText()",newsschaltzeit);	
		}
		else alert('Dimmschaltzeit * Faktor ist mehr als die Newsschaltzeit');			
		}		
		
		
		function abs(zahl) {
			if (zahl < 0) zahl=-zahl;
			return zahl;
			}			

		
		function FarbDimmen() {				
			kopier = Math.round((kopier > zielr) ? kopier - schrittr : kopier + schrittr); // Ziehe die Schrittweite ab oder füge sie hinzu je nachdem
			kopieg = Math.round((kopieg > zielg) ? kopieg - schrittg : kopieg + schrittg);
			kopieb = Math.round((kopieb > zielb) ? kopieb - schrittb : kopieb + schrittb);				
			LieferObjekt('bastiticker').style.color="rgb("+kopier+","+kopieg+","+kopieb+")";				
			j++;
			if (j<faktor) {		
				setTimeout('FarbDimmen()',dimmschaltzeit);
			}	
			else {
				LieferObjekt('bastiticker').style.color="rgb("+zielr+","+zielg+","+zielb+")";	
				j=0;
				FarbeSetzen();
				return true;
				}			
		}
 

Anhänge

Zuletzt bearbeitet:
Re: Javascript Newsfader: Kritisiert mich!

Bei NN4 läuft der Ticker bei mir erst nach einem Reload.
Unter IE4 läuft er auch(falls es dich interessiert).

Das mit NN4 ist aber kein Kritikpunkt.... wenn du mich fragst, kann man in JS mittlerweile gut darauf verzichten, für nicht-DOM-Browser zu schreiben, die benutzt ohnehin niemand mehr.

Der Code sieht ordentlich aus. Man könnte ihn sicher noch dezimieren, aber wenn du ein Tutorial dazu schreiben möchtest, ist er so, wie er jetzt ist, hervorragend geeignet, um die einzelnen Schritte zu erläutern.

Der einzige etwaige Kritikpunkt: innerHTML ist keine DOM-Eigenschaft. Du kannst somit nicht davon ausgehen, dass ein Browser, der getElementById() kennt, auch innerHTML kennt.

Stattdessen solltest du da mit DOM-Methoden den Inhalt des Faders ändern....das wäre sauberer.
 
Hallo Sven,

danke dir für deine konstruktive Kritik - hat mich gefreut!

Kannst du eventuell nochmal kurz auf den letzten Punkt mit dem DOM eingehen? Ich verstehe nicht ganz, warum es keine DOM-Eigenschaft ist und wie ich dieser Ungenauigkeit auf den Pelz rücken kann :-)

Ansonsten habe ich den Ticker schon soweit verbessert, dass jeder Newspunkt auch als Link anklickbar ist. Das würde ich in das Tutorial mit aufnehmen.

Achja, in welcher Form verfasse ich das Tutorial am besten?

Grüße aus Wolfsburg
 
So, hab auch grad mal mit ein paar Browsern getestet.
Hab mit folgenden Browsern getestet, und mit allen lief das Script:

Firefox 1.03
Internet Explorer 6
Opera 7.54
Netscape 7.2
Netscape 8.0 Beta
Mozilla 1.7.7
Konqueror 3.3.2
 
Nett von dir, danke! Das erspart mir eine Menge Testerei.

Ich habe den von Sven angesprochenen Fehler beim Erstladen mit Netscape 4 eben behoben. Scheinbar will der Browser nicht, dass die Browserabfrage in der externen JS-Datei steht. Zumindest beim ersten Laden.
 
Nichts zu danken.
Da ich eh diese Browser auf dem Rechner hab dachte ich mir ich jag das Script mal da durch und guck ob's ueberall klappt.
Besonders mit dem Konqueror ist's ja so eine Sache mit dem Testen, da's den ja nicht fuer Windows gibt.
 
Sven hat mich darauf hingewiesen, dass DOM-Browser, die getElementById verstehen nicht unbedingt innerHTML können müssen.
Habe ich das jetzt richtig verstanden, dass man dafür nodeValue nehmen muss?
Weiß jemand, wie ich das implementieren muss?

Grüße
 
Re: Javascript Newsfader: Kritisiert mich!

Ich verstehe nicht ganz, warum es keine DOM-Eigenschaft ist
...naja, es ist halt keine. innerHTML ist ein Bestandteil von Microsoft-JScript.
Diverse andere Browserhersteller haben das übernommen, da es recht praktisch ist, das w3c, welches für das DOM verantwortlich zeichnet, hat es aber nicht in den Standard aufgenommen.

Achja, in welcher Form verfasse ich das Tutorial am besten?
Die Anleitung: http://www.tutorials.de/announcement.php?f=237

zu den Knoten-Sachen:
du müsstest zuerst mittels createElement() einen a-Knoten erzeugen. Den hängst du dann per appendChild() ind den Bastiticker ein.

Dann erzeugst du einen Textknoten mittels createTextNode() mit einem &nbsp; als Inhalt und hängst diesen in den zuvor eingehängten A-Knoten ein.
(die bisher genannten Sachen müssen nur beim ersten mal passieren...obs das erste mal ist, prüfst du am besten mittels hasChildNodes()... angewendet auf den bastiticker erfährst du darüber, ob dieser einen Kindknoten enthält)

Danach brauchst du lediglich die data/href-Eigenschaft des eingehängten <a>-Knotens zu ändern(das sprichst du dabei an mit LieferObjekt('bastiticker').firstChild)
 
Ok, ich glaube, ich habe es verstanden. Vielen Dank für die wertvollen Tipps!
Es scheint zu funktionieren, oder? Bin mal gespannt auf deine Kritik, Sven :-)

Fallen euch noch weitere Fehler auf?

Code:
// #########################################################################################################################	
		// Newsfader Beta Version 0.3
		// Autor : Bastian B******
		// Änderungen: 
		//  18.04.2005 - 
		//  18.04.2005 - Fehler beim Erstladen mit Netscape 4 behoben.
		//  18.04.2005 - Funktion implementiert, mit der man den News Links zuordnen kann
		//	18.04.2005 - Fehler behoben, der das falsche Zählen der Counter betraf
		//	15.04.2005 - Javascript in index.html in Kommentaren
		//			   - Aufruf der Funktion SwitchText() nun im Script selber über window.onload
		
		// Erfolgreich getestete Browser: (Dank an reptiler und Sven Mintel)
		//	Firefox 0.8
		//	Firefox 1.03
		//	Internet Explorer 4
		//	Internet Explorer 5.5
		//	Internet Explorer 6
		//	Mozilla 1.7.7
		//	Opera 7.54
		//	Netscape 4
		//	Netscape 7.1
		//	Netscape 7.2
		//	Netscape 8.0 Beta
		//	Konqueror 3.3.2 
		
		// Bei Problemen oder Fehlern oder konstruktiver Kritik bitte Email an bastian.bartels@gmx.net

		// Einstellungen für den Ticker
	var A_Tickertext = new Array();
	A_Tickertext[0] = "Webseite wurde aktualisiert: News-Section nun vorhanden.";
	A_Tickertext[1] = "Grüne Frösche wurden gequält: Das Oberlandesgericht klagt!";
	A_Tickertext[2] = "Fans erwarteten es schon lange: Basti gewinnt Schönheitswettbewerb!";
	A_Tickertext[3] = "Morgen Pizza in der Kantine erhältlich...";
	
	var A_Links = new Array();
	A_Links[0] = "http://www.google.de";
	A_Links[1] = "http://www.microsoft.de";
	A_Links[2] = "http://www.schlaglicht.com";
	A_Links[3] = "http://www.prinzenrolle.de";
		
	var StartTag = "+++ "; // optionale Tags, wie z.B. +++ vor bzw. nach dem Content
	var EndTag = " +++";
	
	var newsschaltzeit = 3000; // Zeit, bis die nächsten News kommen
	var dimmschaltzeit = 15;   // Zeit in Millisek, mit der die Farbe gedimmt wird
	
	var r = 0; // Diese Werte geben die Farbe an, von der aus losgedimmt werden soll
	var g = 0;
	var b = 0;	
	
	var zielr = 255; // Diese Werte kennzeichnen die Farbe, zu der gedimmt werden soll
	var zielg = 255;
	var zielb = 255;	
	
	var faktor = 15; // Faktor gibt die Anzahl der Dimmschritte an
	
// Ab hier braucht nichts geändert zu werden...
// #########################################################################################################################
		
			
		//wichtige Zählervariablen:		
		var i=0; 	
		var j=0;		

		//Anlegen einer Kopie der Originalfarben	
		var kopier = r;
		var kopieg = g;
		var kopieb = b;
		
		//Berechnungen der Farbbereiche und der Schrittweite	
		var bereichr = (kopier - zielr > 0) ? kopier - zielr : zielr - kopier;
		var bereichg = (kopieg - zielg > 0) ? kopieg - zielg : zielg - kopieg;
		var bereichb = (kopieb - zielb > 0) ? kopieb - zielb : zielb - kopieb;		
		var schrittr = (bereichr/faktor);
		var schrittg = (bereichg/faktor);
		var schrittb = (bereichb/faktor);	
		
		function ZeitenPruefen() {
			if (dimmschaltzeit * faktor >=newsschaltzeit) {	
				return false;
			}
			return true;			
		}

		
		function FarbeSetzen() {
			kopier = r;
			kopieg = g;
			kopieb = b;	
			return true;
		}
		
		
		function LieferObjekt(id) {
			if (w3cdom) {return document.getElementById(id);}
				else if (docall) {return document.all(id);}
					else if (ns4lay) {return eval('document.'+id);}
			return false;		
		}
		
		
		function SwitchText() {
			if (ZeitenPruefen()) {
				if (i>=A_Tickertext.length) i=0;
				if (w3cdom || docall) {				
					LieferObjekt('bastiticker').style.color="rgb("+r+","+g+","+b+")"; // dunkel setzen					
					if (w3cdom && !docall) {	
						if (!LieferObjekt('bastiticker').hasChildNodes()) {	
							test = document.createElement("a");					// benötigten Knoten einhängen
							LieferObjekt('bastiticker').appendChild(test);
							text = document.createTextNode("");
							LieferObjekt('bastiticker').firstChild.appendChild(text);
						}
						LieferObjekt('bastiticker').firstChild.firstChild.nodeValue = StartTag+A_Tickertext[i]+EndTag;// text hinzufügen						
					}
					else {
						LieferObjekt('bastiticker').innerHTML=StartTag+A_Tickertext[i]+EndTag;
					}	
					FarbDimmen();					
				}
				else if (ns4lay) {
					LieferObjekt('bastiticker_ns').document.fscrollerns_sub.document.open();
					LieferObjekt('bastiticker_ns').document.fscrollerns_sub.document.clear();
					LieferObjekt('bastiticker_ns').document.fscrollerns_sub.document.write(StartTag+'<a href="'+A_Links[i]+'">'+A_Tickertext[i]+'</a>'+EndTag);
					LieferObjekt('bastiticker_ns').document.fscrollerns_sub.document.close();
				}						
				setTimeout("SwitchText()",newsschaltzeit);
				i++;						
			}
			else alert('Dimmschaltzeit * Faktor ist mehr als die Newsschaltzeit');			
		}		
		
		
		function abs(zahl) {
			if (zahl < 0) zahl=-zahl;
			return zahl;
			}			

		
		function FarbDimmen() {			
			kopier = Math.round((kopier > zielr) ? kopier - schrittr : kopier + schrittr); // Ziehe die Schrittweite ab oder füge sie hinzu je nachdem
			kopieg = Math.round((kopieg > zielg) ? kopieg - schrittg : kopieg + schrittg);
			kopieb = Math.round((kopieb > zielb) ? kopieb - schrittb : kopieb + schrittb);
			if (w3cdom && !docall) LieferObjekt('bastiticker').firstChild.style.color="rgb("+kopier+","+kopieg+","+kopieb+")";					
				else LieferObjekt('bastiticker').style.color="rgb("+kopier+","+kopieg+","+kopieb+")";				
			j++;
			if (j<faktor) {		
				setTimeout('FarbDimmen()',dimmschaltzeit);
			}	
			else {
				if (w3cdom && !docall)	{					
					LieferObjekt('bastiticker').firstChild.style.color='rgb('+zielr+','+zielg+','+zielb+')';	//Farbe ändern
					LieferObjekt('bastiticker').firstChild.href = A_Links[(i-1)];  // Link ändern
					LieferObjekt('bastiticker').firstChild.firstChild.nodeValue=StartTag+A_Tickertext[(i-1)]+EndTag;	
				}
				else if (docall) LieferObjekt('bastiticker').innerHTML='<a style="color:rgb('+zielr+','+zielg+','+zielb+')" href="'+A_Links[(i-1)]+'">'+StartTag+A_Tickertext[(i-1)]+EndTag+'</a>';
				j=0;
				FarbeSetzen();				
				}		
			return true;	
		}
		
		window.onload=SwitchText;
 
das läuft gut:)
Du hast allerdings die Browsererkennung in dem Update unterschlagen.
Läuft übrigens auch in Opera8beta

Eines ist mir allerdings noch aufgefallen.....bei Opera:
sowohl V7 als auch 8beta überspringen jeweils einen Text.... zeigen also nur
A_Tickertext[1],A_Tickertext[3],A_Tickertext[5]...usw.

Woran es liegt, hab ich auf die schnelle nicht entdeckt.
 

Neue Beiträge

Zurück