2016-10-05 57 views
-1

我理解事件冒泡以及它是如何從最內部元素遍歷dom的。我很好奇爲什麼這是默認行爲?爲什麼事件會讓這個死氣沉沉?

<div>1 
    <div>2 
     <div>3 
      <div>4 
       <div>5</div> 
      </div> 
     </div> 
    </div> 
</div> 

如果我對每一部分的事件偵聽器,但點擊<div>5</div>爲什麼事件冒泡至DIV4,DIV3,DIV2(ETC)的事件監聽器?

編輯:我不認爲這是「什麼是事件冒泡」,因爲這是要求重複爲什麼不是

+1

如果您對'

5
事件偵聽器'而已,你不會遇到任何氣泡。 – Bergi

+0

好吧,想象一下,第二個'div'代表一個按鈕,內部的元素只是裏面的元素(可能包含一個圖標,一些文本)。當用戶點擊其中的任何地方時,您想將該按鈕視爲已點擊,是正確的?所以你可以在那裏攻擊一個點擊處理程序,而不是在它下面的每個元素。 – vlaz

+1

http://stackoverflow.com/questions/4616694/what-is-event-bubbling-and-capturing#answer-4616720 – adeneo

回答

1

你的看法是錯誤的。 The default for simple events is not to bubble

燒成一個簡單的事件名爲Ë意味着一個trusted事件與 名稱ë其不起泡(除非另有 說明)且不可取消(除非另有聲明)和 (其使用接口Event)必須在給定目標處創建並且 dispatched

因此,HTML中相關的事件就是因爲規範明確地說明了這一點,可能是因爲這樣做更有意義。

這不冒泡一些事件

Readystatechange events when changing the current document readiness

fire a simple eventDocument對象命名readystatechange

2

如果你問爲什麼這是默認的行爲,那麼答案是因爲the language specification says so(重點煤礦):

一個事件監聽器包含以下字段:

  • [...]
  • 捕獲(布爾值,最初假
  • [...]

當一個事件被調度到任何在樹參與的對象(例如一個元素),它也可以訪問該對象的祖先的事件監聽器。首先調用所有對象的祖先事件偵聽器,其捕獲變量設置爲true,並按樹形順序調用。其次,調用對象自己的事件偵聽器。最後,只有當event的bubbles屬性值爲true時,纔會再次調用對象的祖先事件偵聽器,但現在按照逆樹的順序。

如果你問爲什麼該規範定義這種方式,你可以問問自己:
如果你點擊了DIV5,你也點擊DIV4或不?
也就是說最終見仁見智,但對我來說,答案是肯定的,按照我的初步意見:

如果你去過日內瓦,你去過瑞士爲好。

+0

這與Bergi上面的評論一起滿足了我的問題。謝謝。 –

+0

事件冒泡並不取決於您是否具有冒泡階段的偵聽器。 – Oriol