Hallo Zusammen!
Ich sitze gerade bei einem Problem, und bin dadurch auf eine interessante Fragestellung gestossen: So wie es ausschaut, dürfte javascript die Änderungen, die innerhalb einer function gemacht werden, erst "submitten", wenn die Funktion zu Ende ist. D.h. bei folgendem Codeschnippsel:
function changeColor() {
document.getElementByID("content").style.color = "#ff0000";
wait(2000);
}
function wait(millis) {
date = new Date();
var curDate = null;
do {
var curDate = new Date();
} while(curDate-date < millis);
}
Alles anzeigen
dass sich die Schriftfarbe des Elements mit der ID "content" erst 2sek später und nicht sofort ändert. Wie kann man das verhindern? Wie kann man diese Änderungen sofort "nach draussen flushen"?
Wie kommt man auf so eine blöde Fragestellung? Ich hab eine Funktion, die eine Änderung einer bestimmten Variable über ein IFrame an ein Servlet postet, damit falls sich die Variable ändert, das zwar in der Session gespeichert werden kann, aber nicht die ganze Seite neu geladen werden muss (es gibt noch einige andere Variablen).
Die Funktion funktioniert soweit prächtig. Bis ... man auf die Idee kommt, den Button (oder die Buttons) sehr schnell hintereinander zu drücken (aber definitiv kein Doppelklick). Die Funktion wird dann zwar zwei Mal ausgeführt, aber das Formular im IFrame (Request an das Servlet) nur 1x abgeschickt.
Jetzt hab ich mir gedacht, dass ich die Funktion synchronized mach. Das Wort "synchronized" ist zwar schon in JavaScript reserviert, nur ist damit leider keine Funktionalität verbunden. Gut ... also selber eine Art synchronized machen. Kein Problem ... globale Variable "running". Sobald man in der Funktion drinnen ist, wird überprüft, ob running auf false ist. Falls ja, wartet man. Falls nein, setzt man sie auf false und führt den Rest. Würde ja alles superprächtig passen, wenn nicht die Änderung der globalen Variablen "running" nicht erst ganz am Ende der Funktion in die "Aussenwelt" geflusht wird. Womit ich wieder am Anfang der Geschichte angelangt wäre ...
Hat jemand Ideen?