2011-08-16 12 views
7

Tener esta JS código:evento JavaScript orden de ejecución manipuladores

document.getElementById('e1').addEventListener('click', function(){alert('1');}, false); 
document.getElementById('e2').addEventListener('click', function(){alert('2');}, false); 
document.getElementById('e1').click(); 
document.getElementById('e2').click(); 

Me pregunto en qué orden serán las alertas mostrará - va a estar en el orden de los acontecimientos se desencadenan por click() o podría ser al azar ?

Estoy preguntando sobre el comportamiento documentado/estandarizado, no sobre qué navegadores implementan actualmente.

+0

'click();' no va a funcionar, por cierto; esa no es la manera de disparar eventos. Necesita usar 'createEvent',' initEvent' y 'dispatchEvent'. –

+1

No, yo no. http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-2651361 –

+0

En este caso, está bien, pero este método de disparar eventos está lejos de ser universal para la disponibilidad con respecto a todos eventos en todos los elementos. La única manera confiable de disparar eventos es utilizar los tres métodos que he mencionado anteriormente. –

Respuesta

2

Las alertas se ejecutarán en el orden - 1 y luego 2. Esto es porque el evento click es síncrono (ver here) - cuando se emite .click(), el controlador se ejecutará inmediatamente (consulte el último párrafo here). Por lo que este código:

document.getElementById('e1').addEventListener('click', function(){alert('1');}, false); 
document.getElementById('e2').addEventListener('click', function(){alert('2');}, false); 
document.getElementById('e1').click(); 
document.getElementById('e2').click(); 
alert('3'); 

producirá el mismo resultado que

alert('1'); 
alert('2'); 
alert('3'); 
+0

http://www.w3.org/TR/DOM-Level-3-Events/#sync-async +50 según lo prometido –

-1

Seré 1 y luego 2. http://jsfiddle.net/kkYfX/

+0

¿No está seguro de cómo el clic en e2 podría desencadenar una alerta antes de que lo haga el clic en e1? –

+0

Porque los controladores de eventos no se ejecutan inmediatamente cuando se ejecuta 'click()'. Corren "algún tiempo" después de eso, posiblemente en orden diferente. –

+0

@maarons - el segundo debe ser llamado después del primero. El único inconveniente podría ser si el burbujeo del primero hace que se llame al otro antes de que sea llamado por el segundo enunciado. Pero en ese caso se llamará dos veces, y siempre después de la primera. Si el oyente está configurado para disparar en la fase de captura, las cosas pueden ser diferentes, pero eso no es lo que está haciendo el código. – RobG

Cuestiones relacionadas