Code in Firefox mit setTimeout nach Alert in falscher Reihenfolge ausgeführt

8

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: Ссылка

    
Greg 29.05.2015, 07:14
quelle

2 Antworten

6

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 .

  
  1. 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.)

  2.   
  3. Zeigt dem Benutzer die angegebene message an.

  4.   
  5. Optional pausieren , während Sie darauf warten, dass der Benutzer die Nachricht bestätigt.

  6.   

(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 Bedingung goal 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.

    
John Dvorak 29.05.2015, 10:37
quelle
3

Dies ist ein Firefox-Bug.

Ich habe es hier gemeldet: Ссылка

    
Florian Margaine 29.05.2015 09:31
quelle