2011-08-16 2 views
7

Mając ten kod JS:zdarzenie JavaScript zamówienie koparki wykonanie

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(); 

Zastanawiam się w jakiej kolejności alarmy pokaże się - to będzie w porządku zdarzenia zostały wyzwolone przez click() lub może to być przypadkowe ?

Pytam o udokumentowane/wystandaryzowane zachowanie, a nie o to, jakie przeglądarki są aktualnie implementowane.

+0

'kliknięcia();' nie będzie działać, przy okazji; to nie jest sposób na wywoływanie zdarzeń. Musisz użyć 'createEvent',' initEvent' i 'dispatchEvent'. –

+1

Nie, ja nie. http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-2651361 –

+0

W tym przypadku, w porządku, ale ta metoda wypalania wydarzeń jest daleka od uniwersalności pod względem dostępności w odniesieniu do wszystkich wydarzenia we wszystkich elementach. Jedynym niezawodnym sposobem wywoływania zdarzeń jest użycie trzech metod wymienionych powyżej. –

Odpowiedz

2

Alerty zostaną wykonane w kolejności - 1, a następnie 2. Wynika to z tego, że zdarzenie click jest synchroniczne (patrz here) - po wydaniu .click() program obsługi zostanie uruchomiony natychmiast (patrz ostatni akapit here). Więc ten kod:

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'); 

przyniesie taki sam rezultat jak

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

http://www.w3.org/TR/DOM-Level-3-Events/#sync-async +50 zgodnie z obietnicą –

-1

Będę 1, a następnie 2. http://jsfiddle.net/kkYfX/

+0

Nie wiesz, jak kliknięcie e2 może wywołać alert przed kliknięciem e1? –

+0

Ponieważ procedury obsługi zdarzeń nie są uruchamiane natychmiast po wykonaniu polecenia 'click()'. Po pewnym czasie działają "trochę" - być może w innej kolejności. –

+0

@maarons - drugi musi być wywołany po pierwszym. Jedyną możliwą frazą może być to, że bulgotanie pierwszego powoduje, że drugie jest wywoływane, zanim zostanie wywołane przez drugie zdanie. Ale w takim przypadku zostanie wywołany dwa razy i zawsze po pierwszym. Jeśli detektor jest ustawiony na strzelanie w fazie przechwytywania, rzeczy mogą być inne, ale to nie jest to, co robi kod. – RobG