Führen Sie den folgenden Code in einem beliebigen Browser aus (versuchen Sie es mehrmals):
%Vor%Nach meinem Verständnis würde der obige Code dazu führen, dass die Konsolenausgabe lautet:
%Vor%Aber in Firefox (v38.0.1) erzeugt es die folgende Ausgabe:
%Vor%Bitte erklären Sie, warum Firefox so vorgeht. Ich weiß nicht, ob es ein Bug oder der eigene Standard von Firefox ist.
Sie können hier eine Live-Demo sehen: Ссылка
Dies ist ein Fehler. In der HTML5-Spezifikation können Ereignishandler nicht ausgelöst werden, während eine Warnung angezeigt wird:
Abschnitt 6.1.4 definiert die Ereignisschleife.
In 6.1.4.2 bietet dieser Abschnitt auch einige Garantien bezüglich der Reihenfolge, in der Ereignisse ausgelöst werden (Punkt 1 des Algorithmus der Ereignisschleife) und dass das Dokument gerendert wird, nachdem ein Ereignishandler (Punkt 4.3)
Abschnitt 6.4 definiert die Timer-Initialisierungsschritte für setTimeout
:
... 14. Warteschlange die Aufgabe
task
.
Punkt 12 dieses Abschnitts bietet auch eine Garantie für die relative Reihenfolge mehrerer Timeouts - ein später ausgegebener Timeout wird möglicherweise nicht vor einem früher ausgegebenen Timeout ausgelöst, es sei denn, es hat ein kürzeres Timeout
Abschnitt 6.5 definiert das Verhalten alert
.
Brechen Sie optional diese Schritte ab. (Beispielsweise könnte der Benutzeragent dem Benutzer die Option geben, alle Warnungen zu ignorieren und würde daher bei jedem Aufruf der Methode bei diesem Schritt abbrechen.)
Zeigt dem Benutzer die angegebene
message
an.Optional pausieren , während Sie darauf warten, dass der Benutzer die Nachricht bestätigt.
(Hinweis: Die Pause ist für confirm
und prompt
obligatorisch, wenn sie basierend auf den Benutzeraktionen zurückgegeben werden)
Die Spezifikation der Pause sagt:
Einige der Algorithmen in dieser Spezifikation erfordern aus historischen Gründen, dass der Benutzeragent beim Ausführen einer Aufgabe eine Pause einlegt, bis ein Bedingungsziel erreicht ist. Dies bedeutet, dass die folgenden Schritte ausgeführt werden müssen:
...
3. Warten Sie, bis die Bedingunggoal
erfüllt ist. Während ein Benutzeragent eine pausierte Task hat, darf die entsprechende Ereignisschleife keine weiteren Tasks ausführen, und jedes Skript in der aktuell ausgeführten Task muss blockieren. Benutzeragenten sollten während einer Pause weiterhin auf Benutzereingaben reagieren, jedoch in a reduzierte Kapazität, da die Ereignisschleife nichts bewirkt.
(Betonung meiner)
Beachten Sie, dass, wenn alert
nicht pausiert, die Konsolenprotokolle immer noch in der richtigen Reihenfolge sein müssen: Die erste synchrone Ausführung wird abgeschlossen (Protokoll # 2), dann wird das Zeitlimit ausgelöst (Protokoll # 3) und der Benutzer schließt die Warnung. Wie von der Seite javascript beobachtet, ist das Verhalten dasselbe, als ob der Benutzer die Alarmbox sofort geschlossen hätte.
Dies ist ein Firefox-Bug.
Ich habe es hier gemeldet: Ссылка
Tags und Links javascript firefox settimeout alert