Newsfader - Funktion vereinfachen?

sh0x

Erfahrenes Mitglied
Hallo Leute,

Ich habe ja einen Newsfader geschrieben und habe folgende Funktion:

Code:
if (kopier > zielr) {
kopier = (kopier - schrittr);
	if (kopier < zielr) kopier = zielr;
}		
else if (kopier < zielr) {
kopier = (kopier + schrittr);
	if (kopier > zielr) kopier = zielr;
}

if (kopieg > zielg) {
kopieg = (kopieg - schrittg);
	if (kopieg < zielg) kopieg = zielg;
}		
else if (kopieg < zielg) {
kopieg = (kopieg + schrittg);
	if (kopieg > zielg) kopieg = zielg;
}

if (kopieb > zielb) {
kopieb = (kopieb - schrittb);
	if (kopieb < zielb) kopieb = zielb;
}		
else if (kopieb < zielb) {
kopieb = (kopieb + schrittb);
	if (kopieb > zielb) kopieb = zielb;
}

Damit möchte ich überprüfen, ob beim Farbdimmen für jede Farbkomponente R, G und B die Zielfarbe erreicht wird oder sogar übertroffen. Ist dies der Fall, nämlich dass sie übertroffen wird, wird sie gleich der Zielfarbe gesetzt.
Sven, du müsstest mich verstehen ;-)

Bei meinem bisherigen Newsfader bestand nämlich das Problem, dass beim Farbaufhellen zum Beispiel zum Teil je nach Faktor mehr als 255 für eine Farbe erreicht wurde. Das will ich ändern, damit das keine eventuellen Browserbugs auslöst.
Mit der obigen Lösung funktioniert es zwar. Habe aber das Gefühl, dass das auch einfacher gehen müsste, oder?

Das ist nochmal die gesamte Funktion:
Code:
function FarbDimmen() {	
			
			if (kopier > zielr) {
			kopier = (kopier - schrittr);
				if (kopier < zielr) kopier = zielr;
			}		
			else if (kopier < zielr) {
			kopier = (kopier + schrittr);
				if (kopier > zielr) kopier = zielr;
			}
			
			if (kopieg > zielg) {
			kopieg = (kopieg - schrittg);
				if (kopieg < zielg) kopieg = zielg;
			}		
			else if (kopieg < zielg) {
			kopieg = (kopieg + schrittg);
				if (kopieg > zielg) kopieg = zielg;
			}
			
			if (kopieb > zielb) {
			kopieb = (kopieb - schrittb);
				if (kopieb < zielb) kopieb = zielb;
			}		
			else if (kopieb < zielb) {
			kopieb = (kopieb + schrittb);
				if (kopieb > zielb) kopieb = zielb;
			}
					
			if (w3cdom && !docall) {
				LieferObjekt('bastiticker').firstChild.href = A_Links[(i-1)];  // Link ändern
				LieferObjekt('bastiticker').firstChild.style.color="rgb("+kopier+","+kopieg+","+kopieb+")";				
				}
				else {					
					LieferObjekt('bastiticker').innerHTML='<a style="color:rgb('+Math.round(kopier)+','+Math.round(kopieg)+','+Math.round(kopieb)+')" href="'+A_Links[(i-1)]+'">'+StartTag+A_Tickertext[(i-1)]+EndTag+'</a>';
					alert("KopieROT: "+kopier+"  KopieGRÜN: "+kopieg+" KopieBLAU: "+kopieb+" Zähler J: "+j+" Faktor: "+faktor);
					}			
			
			if (j<faktor && zielr != kopier ) {		
				setTimeout('FarbDimmen()',dimmschaltzeit);
				j++;
			}	
			else {				
				j=0;
				FarbeSetzen();				
				}		
			return true;	
		}
 
Vorschlag:
Code:
c=[];
c['schritt']=[4,4,4];
c['kopie']=[0,0,0];
c['ziel']=[120,120,120];

function rgb()
{
    for( i = 0; i < 3; ++i)
        {
            if( c['kopie'][i] != c['ziel'][i] )
                {
                    d = ( c['kopie'][i] > c['ziel'][i] ) ? -1 : 1;
                    c['kopie'][i] += d*c['schritt'][i];
                    if( c['kopie'][i] * d > c['ziel'][i] )
                        {
                            c['kopie'][i] = c['ziel'][i]
                        }
                }
        }
    return('rgb('+c['kopie'].join(',')+')')
}
 
Verdammte Axt, SVEN!

Ich verstehe wirklich garnichts. Naja fast. Was ist das bitte für ein hohes Programmierniveau - ich glaube das werde ich nie erreichen.

Kannst du mir den gefallen tun, und das kurz kommentieren. Ich verliere mich nämlich in diesen komplexen Zeilen...*schwitz*
 
Das ist kein hohes Programmierniveau, das ist vor allem Schreibfaulheit.:)
Streng genommen hab ich sogar mal irgendwo gelesen, dass die Benutzung des conditinal Operator
Code:
(d = ( c['kopie'][i] > c['ziel'][i] ) ? -1 : 1;)

in JS deprecated ist....also besser vermieden werden soll und in Zukunft als Sprachbestandteil entfernt werden soll.
Da JS aber wohl nicht weiterentwickelt werden wird(den Erfinder Netscape gibts schliesslich nicht mehr), sehe ich da kein Problem.

Erläuterung:

Code:
//die  Arrays für die einzelnen Werte, sollte eigentlich klar sein
c=[];
c['schritt']=[4,4,4];
c['kopie']=[0,0,0];
c['ziel']=[120,120,120];

//Die Funktion gibt den geänderte Farbwert im Format rgb(r,g,b) zurück,
//selbiger kann also direkt zugewiesen werden
function rgb()
{
    //jede einzelne Farbe durchlaufen
    for( i = 0; i < 3; ++i)
        {
            //wenn aktuelle und Zielfarbe nicht übereinstimmen 
            if( c['kopie'][i] != c['ziel'][i] )
                {
                    //ermitteln, obs aufwärts oder abwärts gehen soll
                    //dazu wird der Variable d jenachdem der wert +1 oder -1 zugewiesen
                    //im weiteren müssen die einzelnen Werte dann nur noch mit
                    //dieser Variablen multipiziert werden, was die ganzen if-Abfragen einspart
                    d = ( c['kopie'][i] > c['ziel'][i] ) ? -1 : 1;
                    
                    c['kopie'][i] += d*c['schritt'][i];
                    if( c['kopie'][i] * d > c['ziel'][i] )
                        {
                            c['kopie'][i] = c['ziel'][i]
                        }
                }
        }
    //rückgabewert, entsprechenden String zusammenstellen unter Verwendung des "gejointen" Arrays c['kopie']
    return('rgb('+c['kopie'].join(',')+')')
}
 
du bist ein Genie!
Allein das mit dem -1 und +1 ist sehr sehr geschickt in meinen Augen..

Ich habe den Code jetzt verstanden. Ein Ding habe ich noch, suche schon den ganzen Tag nach einer Lösung:
Habe bisher bei jedem "Dimm-Schritt" für docall-Browser dies zugewiesen:
Code:
if (docall) LieferObjekt('bastiticker').innerHTML='<a style="color:rgb('+zielr+','+zielg+','+zielb+')" href="'+A_Links[(i-1)]+'">'+StartTag+A_Tickertext[(i-1)]+EndTag+'</a>';
Ich möchte aber nicht bei jedem der Dimmschritte für docall-Browser soviel ändern, weil die Prozessorlast auf meiner Maschine zumindest bis 25% hinaufgeht.
Also habe ich mir überlegt, dass es ähnlich wie für w3cdom auch einfacher gehen muss, also mit der einfachen Zuweisung der URL a la href="URL". Ist das möglich?
Ich habe schon LieferObjekt('bastiticker').href und .location.href probiert. Aber das alles fügt keinen Link hinzu. Weißt du, wie das geht?
 
Klar, benutze nur die DOM-Methode.
Das "document.all"-Zeug ist nur für IE4 erforderlich, und den kann man nun wirklich vernachlässigen.

IE ist ab V5 DOM-tauglich, und der ist schon 7-8 Jahre alt.
 
ging das denn schon bei IE4 was ich meine? :)

Weil jetzt habe ich schon fast das gesamte Tutorial auf dieser Unterscheidung zwischen diesen Browsern aufgebaut... :-(
 
Nein, IE4 kennt "firstChild" nicht.
Der IE besitzt sein eigenes DocumentObjektModel (seit IE5 kennt er wie gesagt auch das W3C-DOM, sein eigenes Modell ist aber weiterhin präsent)

Im IE-DOM gibt es anstelle der W3C-childNodes die children-Kollektion.

Folgendermassen könntest du also die Attribute im IE(4-6) ändern:
Code:
LieferObjekt('bastiticker').children(0).href = ....
LieferObjekt('bastiticker').children(0).style.color=.....
...und ab IE5 wie gesagt auch nach der w3c-DOM-Methode.
 
Ist zwar jetzt nicht direkt zum Thema.
Aber ich hatte mir ueberlegt, dass es doch garnicht so schwer sein duerfte um dieses lustige JavaScript noch was drumrum zu bauen.
Genauer gesagt, eine Administrations-Oberflaeche fuer die anzuzeigenden News.
Mittels der altbekannten Kombination PHP/MySQL.

Dabei wird dann eben der JavaScript-Teil von PHP geschrieben und kann dadurch ueber eine lustige Admin-Oberflaeche mit neuen News gefuettert werden. Und alte News koennen natuerlich auch geloescht werden.

Nur mal so als Idee...

Wenn ich die Zeit finde werd ich mich mal daran setzen. Sollte eigentlich nicht wirklich ein Problem darstellen.
 
Hey Reptiler, ich habe auch schon mit dem Gedanken gespielt. Anbieten würde es sich wirklich. Und dann kann man das Ding super pflegen.

Zu dir, Sven: muss ich mit der children-Geschichte für IE 4-6 auch erst die Kinder erzeugen und einhängen oder geht das einfach mit deinen 2 angegebenen Anweisungen?
 

Neue Beiträge

Zurück