2013-03-07 29 views
10

Sto provando a scrivere un gestore di eventi per un evento personalizzato in WinJS. Io non sono troppo sicuro di come questo funziona in IE - sto creando un evento personalizzato e dispacciamento esso -È dispatchEvent una sincronizzazione o una funzione asincrona

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

mio gestore è -

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

Posso essere certo che il gestore sarà chiamato in sincronia e non in un secondo momento? Se è così allora qual è la prova.

+0

@Mathletics, perché? se invii manualmente un evento, perché non sparerà immediatamente? – gdoron

+0

@ gdoron Suppongo di non saperlo. Leggendo la documentazione, il comportamento non è chiaro. – Mathletics

+0

@Mathletics, il punto della mia risposta ... :) – gdoron

risposta

1

Il gestore verrà chiamato immediatamente, utilizzando l'implementazione predefinita di WinJS.Utilities.eventMixin. Non c'è differimento.

vostri singoli gestori possono scegliere di fare il lavoro differita utilizzando setTimeout/setImmediate/setInterval/requestAnimationFrame, o qualche altra implementazione laminati personalizzato.

Si noti che se si parla di eventi DOM, chiedendo loro di bolla l'albero elemento DOM - che io non sono al 100% chiaro (forse qualcuno può aggiungere che specifica qui)

+0

Non vedo l'ora di vedere la specifica ['setImmediate'] (https://developer.mozilla.org/en/docs/Web/API/Window/setImmediate) come standard! –

12

E 'garantito per essere sincrono perché:

il valore restituito dispatchEvent indica se qualsiasi ascoltatori che hanno curato l'evento chiamato preventDefault.

Poiché il valore restituito indica se qualsiasi ascoltatori che hanno curato l'evento chiamato preventDefault, il metodo deve bloccare (non ritorno) fino a quando tutti gli ascoltatori sono fatte di esecuzione, che è la definizione di una chiamata sincrona.

Il preventivo sopra riportato è un estratto da the dispatchEvent specification in DOM Level 2 Events, che ha ottenuto lo stato "Raccomandazione" (uno standard) nel novembre 2000. Internet Explorer ha rispettato questo standard since at least IE 9.

Per verificare personalmente, aggiungere una dichiarazione console.log immediatamente dopo la chiamata .dispatchEvent e notare che "boom" (dal gestore eventi) viene sempre registrato per primo.

+0

+1 grazie per avermi gentilmente informato che avevo torto! – gdoron

+0

Buona risposta. solo per riferimento, createEvent/initCustomEvent sono deprecati a favore del costruttore CustomEvent() https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent – Ryan

Problemi correlati