Der Martin: bilder vorladen mit statusanzeige?

Beitrag lesen

Hallo,

für meine bildergalerie würde ich gerde die bilder der navigationsbar vorladen.
läuft auch sehr gut.

das mag sein, aber das "Vorladen" von Bildern bringt unterm Strich selten den Vorteil, den sich der Autor erhofft.

nun wollte ich beim vorladen aber noch infos anzeigen.
beispiel:
20 bilder, also wird auf der seite angezeigt:
bild 1 / 20 geladen
bild 2 / 20 geladen

Diesen Fortschritt zeigen gängige Browser doch schon vollautomatisch in der Statuszeile an (z.B. "18 objects remaining"). Warum willst du diese Funktion noch einmal nachbauen?

beim vorladen zeigt er garnichts an. erst nachdem er mit dem vorladen fertig ist.

Wer ist "er"?

function preload(i){
if(i != (images + 1)){
a[i] = new Image();
a[i].src = i + ".JPG";
document.getElementById("info").innerHTML = i
preload(i + 1);
}

}

er läd alle bilder vor, zeigt aber nichts an.

"Er"?
Ähm, ja, natürlich: Dein Script läuft ja auch ohne Unterbrechung solange, bis alle Bilder geladen oder zumindest angefordert sind. Der Browser hat ja zwischendurch gar keine Gelegenheit, das modifizierte Element #info neu anzuzeigen.
Das Problem wäre beim iterativen Vorladen mit einer for-Schleife genau dasselbe. Du kannst mit Javascript zwar HTML-Elemente verändern, aber du musst dem Browser auch eine Chance geben, diese Änderungen auch anzuzeigen, indem du das Script beendest oder unterbrichst.

Es ist zwar nicht wirklich elegant, aber eine sehr probate Möglichkeit: Kehre zur iterativen Methode zurück und mach aus der for-Schleife eine State Machine. Baue dabei *nur den Schleifenrumpf* in eine JS-Funktion. Diese Funktion lädt dann nur ein einziges Bild vor bzw. fordert es vom Server an. Am Ende ruft die Funktion sich selbst wieder auf, aber nicht direkt, sondern über ein setTimeout() z.B. 10ms später (den ersten Durchlauf musst du dann natürlich "von Hand" anstoßen). Die Schleifenvariable kannst du dabei global machen (quick'n dirty, aber leicht zu realisieren), oder auch mit dem setTimeout-Aufruf jedesmal neu übergeben (etwas mehr Aufwand, aber "sauber").
So hat der Browser zwischen zwei "Schleifendurchläufen" Gelegenheit, die Veränderungen, die JS vorgenommen hat, auch anzuzeigen.

hab auch nur erfahrungen mit java, javascript hab ich vorher noch nie benutzt.

Mir geht's genau umgekehrt: Ich hab von Java keine Ahnung. ;-)

Schönen Abend noch,
 Martin

--
Du kannst dem Leben nicht mehr Tage geben.
Aber dem Tag mehr Leben.