Hallo Leute,
Nach einiger Recherche habe ich leider niemanden gefunden der dasselbe Problem hat wie ich.
Zuerst: Die Seite wird nicht im Internet benutzt sondern stellt eine plattformunabhängige Mini-Anwendung dar, die im Firefox laufen soll.
Zum Start meiner Javascript-Seite wird eine große xml Datei im Hintergrund geparst (Mit XML for <script> -> http://xmljs.sourceforge.net/index.html) und die Daten in viele Listen eingetragen. Es handelt sich bei der XML-Datei um einen Fragenkatalog, der 150 Fragen beinhaltet. Dieses nimmt einige Zeit in Anspruch. So lange, dass Firefox mir nach einiger Zeit meldet, dass ein Script nicht Antwortet. Erst nach zwei bis dreimal klicken auf fortsetzen wird der Vorgang bis zu Ende durchgeführt.
Für diesen Start soll ein Ladebalken eingeblendet werden der dem Benutzer den Ladestand in Prozent mitteilt. Im Anschluss wird der Ladebalken-div versteckt und der Einstellungs-div sichtbar.
Meine Lösung funktioniert soweit schon ganz gut, allerdings nur wenn ich in der Funktion, die den Prozentbalken und -wert ändert ( progress(Wert) ) einen alert() hineinsetze. Lasse ich diesen weg, so kommt nach einiger Zeit die o.g. Meldung wegen dem nicht-antwortenden Skript und die Änderung des Wertes zur Zeit der Fehlermeldung wird eingetragen, der Ladebalken hingegen bleibt im Anfangszustand.
Mir scheint, dass Javascript irgendwie zu schnell arbeitet, jedoch das setzten eines künstlichen Sleeps funktioniert leider auch nicht und führt dazu, dass die Fehlermeldung noch öfter eingeblendet wird
Hier ist der entscheidene Code-Ausschnitt:
function startvorgang(lpic)
{
if (lpic==1)
{
xmlDatei="lpic1.xml.html";
}
else
{
xmlDatei="lpic2.xml.html";
}
xmlIOLoadLocalData(xmlDatei, "initialisierung");
}
function sleep(ms){
var zeit=(new Date()).getTime();
var stoppZeit=zeit+ms;
while((new Date()).getTime()<stoppZeit){};
}
function progress(Wert)
{
OK = 0;
// alert("Mit " + Wert + " anzeigen")
if(Wert < 51)
document.getElementById("balken").style.background = 'rgb(255, ' +
Math.floor(Wert / 50 * 255) + ', 0)';
else
document.getElementById("balken").style.background = 'rgb(' +
Math.floor(255 - ((Wert - 50) / 50 * 255)) +
', 255, 0)';
document.getElementById("rahmenbalken").firstChild.nodeValue = Wert +" % des Fragenkatalogs geladen...";
document.getElementById("balken").style.width = Wert + "%";
OK=1;
// sleep(2000);
alert(Wert + "%");
return OK;
}
// Initialisierungsvorgang der Testeinstellungen
function initialisierung(strXML)
{
var xml;
xml = ""
+ "<?xml version="1.0"?>"
+ strXML;
// alert (xml);
var OK=0;
OK = progress(1);
// Listen zu den Fragedaten
if(OK == 1) liste_fuellen(xml, "fragetitel", "fragetitel", 1, "");
OK = progress(10);
if(OK == 1) liste_fuellen(xml, "fragetyp", "fragetyp", 1, "");
OK = progress(20);
if(OK == 1) liste_fuellen(xml, "punkte", "punkte", 1, "");
OK = progress(30);
if(OK == 1) liste_fuellen(xml, "hinweis", "hinweis", 1, "");
OK = progress(40);
if(OK == 1) liste_fuellen(xml, "erklaerung", "erklaerung", 1, "");
OK = progress(50);
if(OK == 1) liste_fuellen(xml, "fragetext", "fragetext", 1, "");
OK = progress(60);
// Listen zu den Antwortdaten
if(OK == 1) liste_fuellen(xml, "antwort", "antworttext", 1, "");
OK = progress(70);
if(OK == 1) liste_fuellen(xml, "antwort", "zufrage", 2, "zufrage");
OK = progress(80);
if(OK == 1) liste_fuellen(xml, "antwort", "richtig", 2, "richtig");
OK = progress(90);
// Die restlichen Standardantworten eintragen
if(OK == 1) matrix_fuellen();
OK = progress(100);
if(OK == 1) document.getElementById("ladebalken").style.visibility = "hidden";
if(OK == 1) document.getElementById("Einstellungen").style.visibility = "visible";
if(OK == 1) document.Fragenanzahl.VerfuegbarAnzahl.value = AnzahlFragenkatalog();
}
ERLÄUTERUNG ZUM Code unten:
In der Funktion Startvorgang befindet sich eine Funktion aus dem XML for <script>-Framework welcher die XML-Datei einliest.
Diese Ruft nach Einlesen des XML die Funktion initialisierung auf.
Danach werden die einzelnen Listen gefüllt und nach jedem Vorgang soll der Prozentwert geändert werden.
Funktioniert wie gesagt gut, wenn alert() in der Funktion progress() ausgeführt wird und der Benutzer ständig ok klickt. Lässt man das weg kommen Meldungen über das nicht-antwortende Skript.
Die Fehlerkonsole von Firefox meldet keinerlei Fehler bei der Prozedur
Hoffe jemand hat eine Idee, wie ich das ohne den alert hinbekomme
Danke im Voraus
André