Blockade bei weiterer Umsetzung eines zu begrenzenden Fortschrittbalkens

Hallo,

ich möchte über Javascript eine Fortschrittsanzeige umsetzen, die angezeigt wird, während Grafiken vorgeladen werden.

Da ich aber Grafiken unterschiedlicher Ordner vorladen will, es handelt sich bei unserer Homepage um einen Onlineshop, bei dem die Artikelbilder in verschiedenen Ordnern abgelegt sind, habe ich natürlich auch unterschiedliche Anzahlen vorzuladender Grafiken.

Damit die Fortschrittsanzeige aber nicht zu breit wird, möchte ich diese in der Breite begrenzen.

Auf ein Framework oder Plugin möchte ich hierbei verzichten, da mir diese zu überladen sind.

Ich habe mir überlegt, eine maximale Anzahl an anzuzeigenden Segmenten festzulegen und die Schrittweite bei der Ausgabe der Fortschrittsanzeige über den letzten ganzzahligen Teiler vor Erreichen der maximalen Anzahl an anzuzeigenden Segmenten zu ermitteln.

Hier der Code, den ich bislang habe:

function FortschrittsbalkenBerechnen (AnzahlGrafiken, AnzahlSegmente)
{
if (AnzahlGrafiken ';
Fortschrittsbalken += „“;
Fortschrittsbalken += ‚‘;

Zaehler = 1;

for (i = 1, l = BreiteFortschrittsbalken - 1; i ';

Zaehler += 1;
}

Fortschrittsbalken += ‚‘;
Fortschrittsbalken += „“;
Fortschrittsbalken += „“;

document.write (Fortschrittsbalken);

// Funktion zum Vorladen der Grafiken mit Aktualisierung der Fortschrittsanzeige
}

Grafiken = new Array ("…", „…“, „…“, …);

FortschrittsbalkenBerechnen (Grafiken.length, 150);

Mit „FortschrittsbalkenBerechnen (131, 150);“ würde ich beispielsweise angeben, dass 131 Grafiken vorzuladen sind und die Fortschrittsanzeige maximal 150px breit sein soll.

„ErstesSegment0“, „WeiteresSegment0“ und „LetztesSegment0“ sind hierbei die Grafiken für noch nicht geladene Grafiken.

Mein Problem ist nun, dass ich eine Denkblockade habe, wie ich den Mechanimus umsetzen muss, um nun alle vorzuladenden Grafiken mit der Fortschrittsanzeige, die nur alle {Schrittweite} Grafiken angepasst werden soll, in Einklang bringe.

Ich denke hierbei an folgenden Ansatz:

for (i = 0; i

Hallo Enrico,

sorry, da fällt mir aktuell keine Lösung ein. Mein JavaScript ist aber auch schon ziemlich lange her…

LG, Roland

Hallo Enrico,

der Code kommt mir sehr kompliziert vor, um einen einfachen Fortschrittsbalken zu erzeugen. Eigentlich würde es reichen, wenn Du allen Bildern ein onload=funktion() verpasst. Die Funktion macht dann nichts anderes als einen Zähler hochzuzählen. Mittels Dreisatz kannst Du dann den Fortschrittsbalken (egal mit welcher Breite) korrekt laufen lassen.

Beispiel:

  • 131 Bilder sind zu laden
  • 72 sind schon geladen
  • Der Fortschrittsbalken soll 150px breit sein:

150 / 131 * 72 = 82 (gerundet). Dein Balken muss in dem Beispiel also bereits zu 82 Pixel „gefüllt“ sein.

Viele Grüße,

Thorsten

Hi Enrico,

da kann ich dir leider nicht helfen.

Grüße

Axel

Hallo Enrico,

Ich denke, ihr Ansatz ist schon die richtige Richtung. Allerdings sollten sie die Variable i nicht außerhalb der onload-Ereignisse hochzählen lassen!
Das Onload-Ereignis wird soweit ich weiß semi-asynchron ausgeführt. Damit meine ich, dass zuerst Ihre Schleife durchlaufen wird und i von 0 bis AnzahlGrafiken hoch läuft.
Wird nun onload aufgerufen, ist die schleife allerdings bereits zuende, also i=AnzahlGrafiken.

Als minimalbeispiel hierzu:

for(var i=0;i

Ich würd das ganze einfach so machen: beim Aufruf der Funktion FortschrittsbalkenBerechnen(AnzahlGrafiken, MaxBreite) einmal die Schrittweite berechnen und zwar einfach mit

schrittweite = MaxBreite/AnzahlGrafiken:

Und dann bei jedem geladenen Bild die Breite des Balkens um schrittweite erhöhen. Den Balken kann man z.B. als einfache Grafik einbauen, die Anfangs die Breite 0px hat und dann halt immer mit document.getElementById(‚loadergrafik‘).style.width = … raufsetzen.

Hab das schon einige Male so umgesetzt, für die schrittweite kommt meiste eine krude Zahl raus, die kann man mit Math.floor beschönigen, normalerweise kommt javascript aber auch so damit klar.

Ich hoffe ich konnte helfen.

Hallo Roland,

schade, trotzdem danke, dass Dich trotzdem gemeldet hast.

Gruß,
Enrico

Hallo Thorsten,

ein sehr interessanter Ansatz.

Werde ich mir durch den Kopf gehen lassen.

Gruß,
Enrico

Hallo Axel,

schade, trotzdem danke, dass Dich trotzdem gemeldet hast.

Gruß,
Enrico

Hallo Julian,

danke für Deine Antwort.

Kannst Du mir das mit Deinem Code ausführlicher erklären, da ich da leider nicht durchgestiegen bin, was das Einfügen von „Grafik.meinindex=i“ bewirkt. Die Anweisung „console.log(this.meinindex);“ bewirkt eine Ausgabe zu Kontrollzwecken, oder?

Gruß,
Enrico

Hallo Chi,

danke für Deine Antwort.

Damit ich keine ungerade Schrittweite bekomme, habe ich ja die Ermittlung der ganzzahligen Teiler eingebaut.

Dein Ansatz mit einer Grafik, die lediglich in ihrer Breite geändert wird, klingt interessant. Dann könnte ich beispielsweise eine rote Hintergrundgrafik dahinterlegen, die von Anfang an die gesamte Breite hat und den grünen Balken drüber.

Könnte auch hübsch aussehen :smile:

Gruß,
Enrico

Hallo Enrico, ich würde einen anderen Weg gehen. Da es nur eine Obergrenze für den Balken geben soll,so vermute ich, kann die Mindestgröße variieren.Ich kenne leider nicht die Mindestzahl der Grafiken. Ich gehe mal von der Untergrenze 34 aus.Dann Sollte man mit einer Alternativanweisung eine von drei gleichartige Funktionen aufrufen.
Alternative 1 von 34 bis 44. Es wird je eine Grafik geladen und die Balken- breite um drei erhöht. Das wiederholt sich, bist das Laden beendet ist
Wegen 34*3=102 und 44*3=132 ist das eine sinnvolle Größe.Die näch-
ste Alternative wäre von 45 bis 66. Die Grenzen wären hier 90 und 132. Ab 66 Grafiken greift die dritte Alter- native. Es wird mit jeder geladenen Grafik die Pixelbreite um 1 erhöht.
Viele Grüße Hajo!

Hallo Hajo,

danke für Deine Antwort.

Die Anzahl an vorzuladenden Grafiken variiert, da ich, wenn unser Webshop online geht, die Artikelbilder der verschiedenen Ordner über PHP einlesen lasse, neue Artikel dazukommen und andere vielleicht wegfallen. Die Funktion soll deshalb so flexibel wie möglich sein, gleichzeitig aber auch eine maximale Breite nicht überschreiten.

Daher mein Ansatz über den größten ganzzahligen Teiler

Hallo Enrico,
das muß man sich heute nicht mehr wirklich antun. Meine progress bars sind alle mit jQuey UI gemacht. Und das kann man sich maßschneidern, wenn man nur die progress bar benutzen will, muß man des geasmten Rest nicht einbinden. http://jqueryui.com/progressbar/
Viele Grüße,
Thomas

Ja, natürlich!
Entschuldige, wenn das nicht offensichtlich war.
Grafik.meinindex=i;
bewirkt normalerweise das gleiche wie
Grafik.setAttribute(„meinindex“,i);
allerdings habe ich gehört, das setAttribute im IE Probleme macht.
im Endeffekt bewirkt das, dass im HTML-Quellcode sowas steht wie

e.g. für i=2.

jedes eingefügte Bild erhält somit ein für ihn festgelegten Index, den man wieder abrufen kann.

console.log(…) zeigt den Parameter in der Konsole an, wie du gesagt hast, zu Kontrollzwecken.

this bezieht sich hierbei auf das das Ereignis auslösende Element.
Klickst du auf das 3. Bild, dann ist this dieses dritte Bild und this.meinindex gibt dann Index 2 zurück (wenn du mit 0 anfängst zu indizieren).

Wie gesagt ist das nötig, da das onload-Ereignis erst dann auftritt, wenn die Schleife bereits fertig ist und i auf 10 gesetzt wurde.

mit freundlichen Grüßen
Julian

Hallo Enrico,

sorry für die späte Antwort, ich war in Urlaub. Besteht das Problem denn noch? Ich würde es anders angehen, wobei ich nicht sagen will, dass es der Weisheit letzter Schluss ist, aber ich versuchs mal (nicht ganz ausprogrammiert)

var prozent = 0;

while(prozent

Hallo Enrico, LEIDER habe ich nicht ganz so viel Ahnung. Aber ich habe nach Möglichkeiten gesucht. Denn auch mich interessiert diese „Process Bar“ sehr.

Einen Trost habe ich an Dich als kleine Hilfe: gehe mal bitte auf den folgenden Link…:
http://www.antusblog.de/2009/07/27/fortschrittsbalke…

Hier findest Du sicher deine passenden Wünsche…

Nochmals meine Entschuldigung an dich. Ich bin nicht ganz so konfirm…LEIDER…

Dir viel Glück
Gruß Mirko

PS:
ich glaube zu wissen dass Du diesen Balken diverse Werte geben musst. Binde deine Process Bar ganz einfach in einen Div ein.

Bis dann…

Hey Enrico,

ich blicke leider nicht ganz durch deinen Code durch, was zb bringt dieser Teil:

for (i = 1; i