PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bin ich blöd? Schleife in Firefox


darph
2007-02-07, 17:21:11
Also irgendwie... eh. hm.

Zunächst mal eine einfache HTML Datei mit ein paar Bildern.

<html>
<body style="background-color: #cccccc;">
1.<img src="http://www.lala.de/fuxx0r.png">. <br><br>

2.<img src="http://www.lala.de/fuxx0r.png" alt="uff.">. <br><br>

3.<img src="http://www.lala.de/fuxx0r.png" alt="uff." title="Leute beim fuxx0rn">. <br><br>

4.<img src="http://www.lala.de/fuxx0r.png" alt="uff.">. <br><br>

5.<img src="http://www.lala.de/fuxx0r.png" alt="uff.">. <br><br>

6.<img src="http://www.lala.de/fuxx0r.png" alt="uff.">. <br><br>

7.<img src="http://www.lala.de/fuxx0r.png" alt="uff.">. <br><br>
</body>
</html>

Der geneigte Betrachter wird ohne Zweifel feststellen, daß es in diesem hochkomplexen Dokument 7 (in Worten: sieben) Bilder gibt. Geben sollte. Egal. Sieben. Die Zahl soll sieben sein. Nicht fünf, nicht sechs und die acht scheidet völlig aus. Sieben ist die Zahl.

Nun gut.

Man stelle sich eine kleine imaginäre Extension für Firefox vor, welche in etwa folgenden Code enthält (gekürzt auf das Wesentliche):


function testMich(im, i) {
alert("Bild " + i);
}


function testMain() {
// Alle Bilder im Dokument
var imgs = window._content.document.getElementsByTagName("img");

alert("Anzahl " + imgs.length);

for (i = 0; i < imgs.length; i++) {
currentImage = imgs[i];
testMich(currentImage,i);
}
}

window.addEventListener("load",function() {testMain();} ,true);


Also: Sobald das onLoad-Event feuert, also sobald meine Seite geladen ist, bekomme ich einen Alert, der mir sagt, wie viele Bilder ich habe. Wir erinnern uns - sieben sind es. Das stimmt auch. Ich bekomme eine MessageBox und die sagt sieben. So weit so gut.

Dann wird die Methode testMich für jedes Bild (hier genannt 0 bis 6) aufgerufen. Dort gibt's nochmal einen Alert, der mir sagt "Ich packe gerade das so-und-so-vielte Bild an". Richtig?

Wieso bekomme ich bei oben beschriebener Seite dann nur Alerts mit "0", "1", "2", und "3" und wieso ist das (ließ sich durch geschicktes benennen des alt-Attributs herausfinden) IMMER JEDES ZWEITE BILD?

Jedes Zweite Bild wird ignoriert.


Bin ich doof? Hab ich was falsch gemacht? Da steht i++, also i = i+1. Plus eins. Wieso zählt meine Schleife in Zweierschritten? Bin ich blind? Wo ist mein Fehler? Wahrscheinlich seh ich mal wieder den Wald vor lauter Bäumen nicht, aber... eh... halp! ;(

UliBär
2007-02-07, 22:10:39
Hmm...
Sieht soweit korrekt aus. :confused:
Könnte es sein, daß Du irgendwo ein Makro verwendest, in dem i++ steht, welches dann in der Schleife eventuell zweimal aufgelöst wird?

[edit] Oder wird eine Variable i sonst noch irgendwo verwendet?
Normalerweise sollte die Schleife so aussehen:
for ( int i = 0; i < imgs.length; i++) {
currentImage = imgs[i];
testMich(currentImage,i);
}

Sephiroth
2007-02-08, 00:06:26
Hmm...
Sieht soweit korrekt aus. :confused:
Könnte es sein, daß Du irgendwo ein Makro verwendest, in dem i++ steht, welches dann in der Schleife eventuell zweimal aufgelöst wird?

[edit] Oder wird eine Variable i sonst noch irgendwo verwendet?
Normalerweise sollte die Schleife so aussehen:
for ( int i = 0; i < imgs.length; i++) {
currentImage = imgs[i];
testMich(currentImage,i);
}
X-D Uli
in javascript gibt es (noch) kein int ... wenn das int ein var wär hät ich ja nichts dagegen aber so? ;) und ob das var da ist oder nicht, ändert an der funktionsweise nichts.

darph, ich teste gleich mal. du kannst auch mal in die überaus nützliche fehler/javascript-konsole sehen, ob da fehlermeldungen drinne stehen. (ggf. javascript.options.showInConsole in about:config aktivieren)

p.s.
darph, es funktioniert aber eines noch:
window.addEventListener("load", testMain, true);
ist völlig ausreichend, wozu bitte nochmal eine funktion angeben, die eh nur die andere aufruft?

UliBär
2007-02-08, 00:14:05
X-D Uli
in javascript gibt es (noch) kein int ... wenn das int ein var wär hät ich ja nichts dagegen aber so? ;) und ob das int da ist oder nicht, ändert an der funktionsweise nichts.X-D Sephiroth
selbst in Javascript wird in dem Fall eine eventuell global definierte Variable i genutzt und nicht eine lokale Variable verwendet. Aber Du hast recht, in Javascript müßte es var i heißen - bin halt C++/Java-versaut. :cool:

darph
2007-02-08, 00:19:00
ist völlig ausreichend, wozu bitte nochmal eine funktion angeben, die eh nur die andere aufruft?
Ja. :usad:

Das Problem war übrigens ein ganz famoses. Aber das darph ich Euch nicht erzählen. Duz ist peinlich. ;(


Okay, nächstes Problem: Wie packe ich einen onError-Event-Handler an ein Bild? Über onLoad und dann an alle Bilder im Dokumant (so wie hier) geht's ja nicht: OnLoad wird erst aufgerufen, wenn alles geladen ist - dann feuert aber kein onError-Event mehr. ;(

Vorschläge? ;(

Sephiroth
2007-02-08, 00:19:54
X-D Sephiroth
selbst in Javascript wird in dem Fall eine eventuell global definierte Variable i genutzt und nicht eine lokale Variable verwendet.
Nein wird es nicht - auch nicht in C++ oder Java.

UliBär
2007-02-08, 00:22:50
Nein wird es nicht - auch nicht in C++ oder Java.Wenn Du sie nicht extra lokal deklarierst, sie aber in dem Scope bekannt ist, sehr wohl...

Sephiroth
2007-02-08, 00:30:29
Wenn Du sie nicht extra lokal deklarierst, sie aber in dem Scope bekannt ist, sehr wohl...
Naja, ok, dann schon, das stimmt natürlich. :) Aber dann würde sie dennoch zunächst auf 0 gesetzt werden. ;) In der Schleife (der Funktion) ist dann noch alles easy, aber bei dem Code danach nicht mehr, da sich der Wert der globalen Variable ja geändert hat.

Sephiroth
2007-02-08, 20:39:34
Okay, nächstes Problem: Wie packe ich einen onError-Event-Handler an ein Bild? Über onLoad und dann an alle Bilder im Dokumant (so wie hier) geht's ja nicht: OnLoad wird erst aufgerufen, wenn alles geladen ist - dann feuert aber kein onError-Event mehr. ;(

Vorschläge? ;(
Da fällt mir bis jetzt nur eines ein: Observer. Der Überwacht jedes Bild und wenn eines nicht geladen werden kann, dann mache XY. Problem dabei ist aber ein passendes Interface zu finden, was von den hier gelisteten Komponenten (http://www.xulplanet.com/references/xpcomref/ifaces/nsIObserver.html) implementiert wird.
Und wie ich so gerade schreibe und ein wenig auf xulplanet.com suche, wäre es vielleicht möglich via XBL binding allen img-Tags einen error event handler schon von vornherein mit auf den Weg zu geben. -> http://www.xulplanet.com/tutorials/xultu/xblinherit.html

Dein vorhaben über den event handler ist in der tat kniffelig.

p.s.
vielleicht mal im mozillazine-forum (http://forums.mozillazine.org/viewforum.php?f=19) nachfragen
Thread Just Before Page Load Event? (http://forums.mozillazine.org/viewtopic.php?t=49716)

ethrandil
2007-02-09, 00:58:21
Das Problem war übrigens ein ganz famoses. Aber das darph ich Euch nicht erzählen. Duz ist peinlich. ;(
*räusper* damit kommst du hier nicht durch... ;)

Ich frage mich gerade was ein onError-Event bewirken soll. Kannst du nicht im Vorhinein prüfen, ob eine Bildadresse erreichbar ist? [fragt eth, der keine Ahnung hat was JavaScripts auf seinem Rechner alles tun dürfen und sie deshalb ausgeschaltet hat.]

mfg
- eth

darph
2007-02-09, 13:37:04
Naja, es geht ja nicht um JavaScript in der Seite, sondern um eine Extension. Die werden ebenfalls damit erstellt. :)

Das Vornherein prüfen wäre sicher möglich - würde aber das Anzeigen der Seite signifikant verlangsamen, weil ja jede Grafik 2x geladen werden würde: Einmal von der Extension und einmal von der Seite selbst. ;(


JavaScripts in der Seite dürfen übrigens gar nichts, das stellt kein Sicherheitsrisiko dar (Ja, stimmt nicht ganz, so ideal ist die Welt nicht, aber naja). Stichwort Sandbox.