2013-02-01 102 views
3

如果我將兩個事件偵聽器註冊到同一個事件目標。哪個事件處理程序將首先被調用?事件偵聽器到第一個被調用的同一個事件目標

例子:

document.addEventListener("click", function() { 
    // do something 1 
}, true); // using the capturing phase 

document.addEventListener("click", function() { 
    // do something 2 
}, true); // using the capturing phase 

我沒有發現我在W3C規範的答案。

DOM-Level-3-Events

+0

[JavaScript中的事件處理函數按順序調用嗎?]可能的重複項目(http://stackoverflow.com/questions/2706109/are-event-handlers-in-javascript-called-in-order) –

+0

嘗試使用不同的瀏覽器http://jsbin.com/azuzef/1/edit,谷歌瀏覽器和Firefox似乎是按聽衆的順序添加的。 –

+2

[HTML5規範](http://www.w3.org/TR/DOM-Level-3-Events/#event-flow)說:「已在當前目標中註冊的所有事件偵聽器的列表他們的註冊順序「和」實施必須按順序處理所有候選事件處理程序「。 – pimvdb

回答

1

粗體加着重號來回答這個問題(通過W3C規範:http://www.w3.org/TR/DOM-Level-3-Events/#event-phase

第一,實現必須確定當前的目標。這必須是部分傳播路徑中的下一個未決事件目標,從第一個開始。從事件監聽器的角度來看,這必須是監聽器已註冊的事件目標。

接下來,實現必須確定當前目標的候選事件偵聽器。這必須是已註冊在當前目標上的註冊順序爲的所有事件偵聽器的列表。 [HTML5]定義通過事件處理程序屬性註冊的偵聽器的順序。一旦確定,候選事件監聽器不得改變;添加或刪除偵聽器不會影響當前目標的候選事件偵聽器。

最後,執行必須處理所有候選事件處理程序,以便,引發每個處理程序,如果下列所有條件都滿足...

我個人始終依靠這種行爲,我有沒有看到現代瀏覽器的行爲與規範描述不同。

相關問題