Struppi: wird bei new Image() automatisch vorgeladen?

Beitrag lesen

Ja, nochmal,ich glaube Du hast mein problem nicht verstanden,
ich möchte eine loadbar dynamisch angezeigt haben auf dem display welches fährt,wie eine level anzeige bei einer stereoanlage,wenn möglich noch mit einer anzeige von 0-100%,die auch hochzählt in realtime,solange bilder geladen werden.
Und das geht nicht ohne setTimeout auch nicht auf twb's seite.
Mein script oben zeigt es genau so an,ich will kein alert popup,mit einer bestätigung.

Doch ich habe dein Problem verstanden, nur tut dein Skript in dem Falle nichts anderes als diese Bar anzeigen. Da complete ja beim aufruf immer false ist.

Ich versuch mal dein Skript  zu erklären:
function loadimages(){
for(n=0;n<images.length;n++){
img[n]=new Image();
img[n].src=images[n];
setTimeout('checkload('+n+')' ,n*60);
}}

Die schleife wird images.length mal aufgerufen, dabei wird images.length der Timeout gesetzt, jeweils nach ca. 60 ms (Milliskeunden) n ist dabei vernachlässigbar.

d.h. nach ca. 60 ms wird das erste mal checkload(x) aufgerufen:
function checkload(index){
(img[index].complete)? dispbars() : setTimeout('checkload('+index+')', 40);
status='Wait...images loading...';
}

img[index].complete ist vermutlich false und wird nach 40 milisekunden wieder aufgerufen. Zwischenzeitlich dürfte eine Menge anderer Timeouts aus der ersten Funktion diese Funktion auch aufgerufen haben, so läuft jetzt das ganze ab, alle 40 ms wird diese Funktion images.length mal aufgerufen, da kann einiges zusammenkommen.

Gleichzeitig lädt der Browser die Bilder, wenn du (bzw. deine Besucher) Glück hast sind alle Bilder verfügbar und irgendwann tritt die Abruchbedingung ein (ich hab schon erlebt, das beim paralelen aufrufen von einer Funktion das nicht mehr richtig funktioniert hat) und alles ist in Ordnung.
Doch was ist, wenn grad der Server down ist? Oder ein Bild aus versehen gelöscht, umbenannt wurde?
Das Skript hört nie mehr auf.

Wenn du statdessen das machst:
(img[i].complete)? dispbars() : dispbars();

Brauchst du den ganzen Schmoder nicht, da du dann ganz einfach nur die Schleife durchlaufen lassen kannst und fertig.

Aber abgesehen davon, dir ist klar, das ein Preloader einerseits die übertragene Datenmenge erheblich vergrößert und je nach Einstellung des Browsers der User die Bilder zweimal laden muss?

Du kannst das was du willst mit onload wesentlich sinnvoller machen.
In etwa so:

In der Schleife:

for(n=0;n<images.length;n++){
img[n]=new Image();
img[n].onload = disbars; // ohne Klammer!
img[n].onerror = disbars; // ohne Klammer!
img[n].src=images[n];

Und die Funktion checkload kannste dir Schenken.

Struppi.