JavaScript unterbrechen (alert() ohne Ausgabe)
Stefan
- javascript
Hallo,
ich hab ein Problem:
Ich habe zwei Aufrufe die in JS nicht direkt hintereinander funktionieren, sondern z.B. wenn ein alert("hallo") dazwischen steht. Ich habe schon eine sleep()-Funktion mittels XMLHttpRequest und PHP gebaut, die hilft auch nicht, auch wenn ich sie noch so stark verzögert, ich kann die MessageBox noch so schnell wegklicken wie ich will, dann klappt es. Das Problem tritt in Firefox (teilweise) und Safari auf. Gibt es irgendeinen Trick den JavaScript-Code zu unterbrechen? Ich habe leider auch keinen Einfall wie das mit setTimeout oder so gehen könnte:
function b()
{
...
foo();
alert("hallo");
y = bar();
...
return x;
}
function a()
{
...
if(...) x = b()
...
}
Wenn ich das alert() weglasse geht es nicht. Ich habe schon probiert bar() mit setTimeout aufzurufen, aber das klappt nicht, da ich wieder solange warte bis bar() aufgerufen wurde und damit immernoch nicht den Code unterbrochen habe. Ich brauche entweder eine Idee wie ich hier mit setTimeout arbeiten kann oder ob es so eine Funktion wie alert() gibt, jedoch ohne Ausgabe.
Viele Grüße,
Stefan
Hallo,
Hallo,
ich hab ein Problem:
Ich habe zwei Aufrufe die in JS nicht direkt hintereinander funktionieren
Warum? Was machen foo und bar?
Ich habe schon eine sleep()-Funktion mittels XMLHttpRequest und PHP gebaut
Argh. sleep() in JavaScript ist fast immer unsinnig.
Gibt es irgendeinen Trick den JavaScript-Code zu unterbrechen?
In JavaScript gibt es kein »Unterbrechen«, sondern eine Funktion endet, dann kommt die JavaScript-Ausführung zur Ruhe und z.B. durch einen Timeout wird eine Funktion zeitverzögert gestartet.
Du kannst nicht einen Programmteil auf die verzögerte Ausführung eines anderen Programmteiles »warten« lassen.
Ich habe schon probiert bar() mit setTimeout aufzurufen, aber das klappt nicht, da ich wieder solange warte bis bar() aufgerufen wurde und damit immernoch nicht den Code unterbrochen habe.
Den Satz verstehe ich nicht.
Ich glaube, der Knackpunkt liegt darin, dass du einen Programmablauf geschrieben hast, der Zeile für Zeile ohne Unterbrechung durchlaufen muss. Das musst du umschreiben, sodass er mit setTimeout funktioniert.
var rückgabe = bar();
// Mach was mit rückgabe
Wenn du bar jetzt zeitverzögert aufrufen willst, kommst du natürlich nicht an dessen Rückgabewert:
var rückgabe = window.setTimeout(bar, 2000);
// Mach was mit rückgabe - geht aber nicht
Also musst du das »Mach was mit rückgabe« in die Funktion packen, die zeitverzögert aufgerufen wird.
function bar () {
// berechne rückgabe
// mach was mit rückgabe
}
...
function b () {
...
window.setTimeout(bar, 2000);
// hier ist dann Ende
}
Deine Funktion a muss dann entsprechend angepasst werden. Das, was nach dem b()-Aufruf kommt, muss in den Teil »mach was mit rückgabe«. So hast du letztlich eine Kette von Funktionen, die sich verzögert aufrufen. Das ist das gleiche wie mit Event-Handlern, da gibt es z.B. kein »Warte, bis die Maustaste wieder losgelassen wurde«, sondern einen mousedown- und einen mouseup-Event.
Mathias
Hallo Mathias,
es um geht um den Aufruf einer Funktion eines Java-Applets (meinapplet.foo(); ->LiveConnect). Ich binde das Applet dynamisch ein, die Funktion ist in Safari und teilweise in Firefox aber erst verfügbar, nachdem der JavaScript-Code unterbrochen wurde z.B. mit alert(), teilweise kann ich auch mit sleep warten bis das Applet geladen ist, aber hier klappt das nicht.
Die Auftrennung der Funktion ist nicht so einfach, das könnte höchstens mit Funktionszeigern gehen.
mousedown und mouseup habe ich hier aber nicht, sondern etwas, das theoretisch, jedoch nicht praktisch, sofort passiert und daher gibt es auch kein event-Handler der die Funktion aufruft sobald es passiert ist.
Viele Grüße,
Stefan
Hallo,
es um geht um den Aufruf einer Funktion eines Java-Applets (meinapplet.foo(); ->LiveConnect). Ich binde das Applet dynamisch ein, die Funktion ist in Safari und teilweise in Firefox aber erst verfügbar, nachdem der JavaScript-Code unterbrochen wurde
Wenn du nicht genau weißt, ob die Funktion nach einer bestimmten Zeit verfügbar ist, dann nimmt einen Intervall, der alle 100 Millisekunden o.ä. fragt, ob die Funktion verfügbar ist. Im Erfolgsfalle stoppe den Intervall und fahre mit dem Programm fort.
Die Auftrennung der Funktion ist nicht so einfach
Geht halt nicht anders.
Mathias
Hallo,
Wenn du nicht genau weißt, ob die Funktion nach einer bestimmten Zeit verfügbar ist, dann nimmt einen Intervall, der alle 100 Millisekunden o.ä. fragt, ob die Funktion verfügbar ist. Im Erfolgsfalle stoppe den Intervall und fahre mit dem Programm fort.
Genau das habe ich probiert, aber warten hilft nicht, JavaScript muss wohl einmal komplett unterbrochen werden, damit der Browser was anderes machen kann.
Geht halt nicht anders.
Ich habe es soweit fertig ich habe doch ein Problem: Wie übergebe ich setTimeout eine Funktion, welcher ich eine Funktion mit Prameter übergebe?
Zur Verdeutlichung:
Ich habe die Funktionen
abc(q,w)
xyz(e,r,t)
sowie eine Funktion:
timeoutfunktion(funk)
{
...
funk;
}
und Irgendwo wird das timeout gestartet:
window.setTimeout("timeoutfunktion("abc(g,h)")",100);
oder
window.setTimeout("timeoutfunktion("xyz(i,j,k)")",100);
So klappt das aber nicht (gibt aber kein Fehler). Wie muss ich das machen, damit das klappt?
Viele Grüße,
Stefan
Hallo,
window.setTimeout("timeoutfunktion("abc(g,h)")",100);
oder
window.setTimeout("timeoutfunktion("xyz(i,j,k)")",100);
Erstmal: setTimeout führt die übergebene Funktion bzw. den übergebenen String im globalen Geltungsbereich aus. Wenn g, h, i ... keine globalen, sondern lokale Variablen sind, dann geht das natürlich nicht, weil dort kein Zugriff auf lokale Variablen einer längst abgelaufenen Funktion möglich ist.
Das heißt nicht, dass man es nur mit globalen Variablen lösen kann. Du kannst es auch mit anonymen Funktionen und Closures lösen:
var g = 1, h = 2;
setTimeout(function () {
timeoutfunktion(function () {
abc(g, h);
});
}, 100);
timeoutfunktion nimmt dann ein Funktionsobjekt entgegen, das es ganz einfach über () hinter dem Parameternamen aufrufen kann.
Das ist allerdings crazy, wahrscheinlich gibts eine bessere Lösung. Aber dazu müsste man konkreter wissen, was timeoutfunktion, abc und xyz machen und was es mit den Parametern auf sich hat.
Mathias
Hallo,
habe gerade die Lösung gefunden:
http://forum.de.selfhtml.org/archiv/2004/3/t75401/
Jetzt scheint es zu klappen!
Vielen Dank,
Stefan
Hi Stefan,
hier ein Link zu einem SELFHTML Artikel vom Mathias Schäfer.
Link: http://aktuell.de.selfhtml.org/artikel/javascript/timer/#timer
Der Artikel ist sehr umfangreich und könnte dir helfen.
An alle: Ich habe aber ein ähnliches Problem. Ich möchte gern ein Array mit Embed Objekten Zeitverzögert ausgeben lassen. Habe mich auch eingehend mit dem Artikel auseinandergesetzt. Leider komm ich zu keinem richtigen Ergebnis. In PHP funktioniert diese Verzögerung super. Hier ein Codebeispiel:
<?php
for($i=0;$i<7;$i++)
{
flush();
usleep(2070000);
echo $sounds[$i];
}
?>
Und dies möchte ich gern in JavaScript umsetzen. Hab wie gesagt auch schon sehr viel mit setInterval() und setTimeout() gearbeitet. Aber entweder wird mir die Seite per document.write nach dem zweiten Aufruf zerschossen und die Funktion wird nicht mehr aufgerufen oder das Ding ruft sich nur einmal auf und stoppt dann.
Das gleiche Beispiel mit der Ausgabemethode alert() funktioniert einwandfrei.
Wäre auch sehr dankbar für hilfreiche Infos oder Anregungen.
Liebe Grüße:
Teladi
Hallo,
Und dies möchte ich gern in JavaScript umsetzen.
Dann gilt für dich genauso mein anderes Postings.
entweder wird mir die Seite per document.write nach dem zweiten Aufruf zerschossen
document.write kannst du nicht »verzögern«, das wird beim Parsen des Dokuments direkt ausgeführt und danach ist document.write »verboten«.
Wenn du *nach* dem Laden des Dokuments etwas ins Dokument einfügen willst, und das immer wieder verzögert, dann nutze das DOM.
und die Funktion wird nicht mehr aufgerufen oder das Ding ruft sich nur einmal auf und stoppt dann.
setInterval und clearInterval ist genau das richtige. Wenn du 7mal eine Funktion aufrufen willst, speicherst du irgendwo global, wie oft die Funktion schon aufgerufen wurde und brichst den Intervall rechtzeitig ab.
Mathias