2012-09-25 48 views
6

我知道一個事件有兩種模式 - 冒泡和捕捉。事件冒泡/捕獲 - 它在哪裏開始/結束?

當事件設置爲冒泡時,JavaScript是否檢查「文檔」?

當事件被設置爲捕獲時,JavaScript總是從「文檔」開始?

Javascript如何知道停止/開始的地方?

更新:

比方說,我在我的身體標記下面的代碼。

<div id='outer'> 
    <div id='inner'></div> 
</div> 

當我將一個事件設置爲#inner來冒泡,Javascript檢查文檔還是停在#outer?

+2

從怪異模式非常豐富的文章:http://www.quirksmode.org/js/events_order.html – techfoobar

+1

@techfoobar//我實際上閱讀了這篇文章,但它不清楚Javascript是否檢查文檔或停在父元素。 – Moon

+1

如果它在外面停下來,它將如何知道document.body或類似文件中是否有任何事件偵聽器? –

回答

2

事件冒泡

的JavaScript檢查一路上漲記錄。如果在文檔和內部監聽器上添加監聽器,則兩個監聽器都會觸發。

事件捕捉

的JavaScript文件,從開始,去一路下跌到內部。如果在文檔和內部監聽器上添加監聽器,則兩個監聽器都會觸發。


我的發現

原來,瀏覽器不會某種智能的處理,使其

一)在整個父層次結構不具有循環

和b)不必循環所有事件。


證明

一)它採用瀏覽器沒有時間同時觸發點擊事件被點擊內部的div時:

Fiddle

B)這需要在瀏覽器沒有時間觸發兩個單擊事件,當單擊內部div時,存在很多其他事件,並且這些事件與其他DOM元素不在父級層次中相連接:

Fiddle

+0

事件冒泡//即使文檔沒有事件? – Moon

+0

編輯答案... –

1

部分答案..

1 - 當事件被設置爲泡沫,並檢查的Javascript達 「文件」?

若層次結構中的一個元素決定通過調用stopPropagation()

5

從W3C Document Object Model Events

停止冒泡我知道我挑剔,但它不是JavaScript的處理事件您正在描述,它是DOM引擎(文檔對象模型)。在瀏覽器中,JavaScript和DOM引擎之間存在綁定,因此事件可以傳播到JavaScript,但不限於JavaScript。例如MSIE支持BASIC。

當事件設置爲冒泡時,JavaScript是否檢查「文檔」?

1.2.3「這個向上的傳播將繼續直至幷包括文檔」

「的任何事件處理程序可以選擇,以防止進一步的事件傳播通過調用事件接口的stopPropagation方法。如果有任何事件監聽調用此方法,當前EventTarget上的所有其他EventListeners將被觸發,但冒泡將在該級別停止「

當事件設置爲捕獲時,JavaScript總是從」文檔「開始?

1.2.2 「捕獲從樹上,一般文檔的頂部運行,」