2013-03-07 5 views
10

Ich versuche, einen Ereignishandler für ein benutzerdefiniertes Ereignis in WinJS zu schreiben. Ich bin nicht sicher, wie dies in IE funktioniert - ich ein benutzerdefiniertes Ereignis am Erstellen und Versenden es -Ist dispatchEvent eine Synchronisierung oder eine asynchrone Funktion

var eventObject = document.createEvent("CustomEvent"); 
eventObject.initCustomEvent("dropbomb", true, true, null); 
this._element.dispatchEvent(eventObject); 

Mein Handler -

this._element.addEventListener("logtelemetry", function() { 
       console.log("boom"); 
}); 

Kann ich sicher sein, dass der Handler aufgerufen wird synchron und nicht zu einem späteren Zeitpunkt? Wenn ja, was ist der Beweis?

+0

@Mathletics, warum? Wenn Sie ein Ereignis manuell versenden, warum wird es nicht sofort ausgelöst? – gdoron

+0

@gdoron Ich nehme an, ich weiß es nicht. Nach dem Lesen der Dokumentation ist das Verhalten wirklich nicht klar. – Mathletics

+0

@Mathletics, der Punkt meiner Antwort ... :) – gdoron

Antwort

1

Der Handler wird sofort aufgerufen, wobei die Standardimplementierung WinJS.Utilities.eventMixin verwendet wird. Es gibt keinen Aufschub.

Ihre einzelnen Handler können wählen latente Arbeit zu tun setTimeout/setImmediate/setInterval/requestAnimationFrame, oder eine andere Implementierung kundenspezifische gerollt.

Beachten Sie, dass, wenn Sie über DOM-Ereignisse sind im Gespräch, um sie zu sprudeln die DOM-Element Baum zu fragen -, dass ich auf nicht 100% klar bin (vielleicht jemand hier, dass bestimmte hinzufügen)

+0

Ich freue mich darauf, die ['setImmediate'] (https://developer.mozilla.org/en/docs/Web/API/Window/setImmediate) Spezifikation als Standard zu sehen! –

12

Es ist garantiert zu sein Synchron weil:

der Rückgabewert von dispatch, ob eine der Hörer gibt, die das Ereignis genannt prevent behandelt.

Da der Rückgabewert gibt an, ob eine der Zuhörer, der das Ereignis genannt prevent behandelt, muss das Verfahren, bis alle der Hörer (nicht zurückkehren) blockieren die Ausführung fertig sind, die die Definition eines synchronen Aufruf ist.

Das obige Zitat ist ein Auszug aus the dispatchEvent specification in DOM Level 2 Events, der im November 2000 den Status "Empfehlung" (ein Standard) erreicht hat. Internet Explorer hat diesen Standard since at least IE 9 erfüllt.

Um für sich selbst zu überprüfen, fügen Sie eine console.log Anweisung unmittelbar nach Ihrem .dispatchEvent Aufruf hinzu und beachten Sie, dass "boom" (von Ihrem Event-Handler) immer zuerst protokolliert wird.

+0

+1 danke, dass du mich wissen lässt, dass ich falsch lag! – gdoron

+0

Gute Antwort. Nur zu Referenzzwecken ist createEvent/initCustomEvent nicht mehr gültig für den CustomEvent() - Konstruktor https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent – Ryan