1. 程式人生 > >JS事件之事件流機制

JS事件之事件流機制

眾所周知JS和HTMl元素的互動幾乎都是通過“事件”來完成的,事件從觸發到完成響應一般分為3個階段:捕獲階段,目標階段,和冒泡階段。

那麼事件是在捕獲階段響應 還是在冒泡階段響應那?? 我們是可以手動設定事件是在捕獲階段響應還是在冒泡階段響應。

理解JS的事件流機制對充分理解JS的事件至關重要,那麼什麼是JS的事件流那??

事件流:

可以理解為當事件發生時,響應事件的順序。這個順序就按照一個流進行的。這就是事件流。這個流是從裡向外流,還是從外向裡流那??不同的瀏覽器事件流的流向不太一樣。

例如IE採用的是 “事件冒泡流”(從裡向外流),自然響應事件的順序也是從裡向外的,事件冒泡流也是大部分瀏覽器採用的預設方式;

而網景採用的是 “事件捕獲流”(從外向裡流)

那麼什麼是事件冒泡流那??什麼有時事件捕獲流那???


比如上圖body裡面有個div,div裡面有一個button,當點選button的時候,瀏覽器會認為你同時點選了div,也點選了body。

如果button,div,body上都綁定了onclick事件,當點選button時,onclick事件就會按照事件流的流向依次做出響應,那麼事件的響應順序是從裡往外流,還是從外向裡那??

IE的“事件冒泡流”會認為是從裡往外; 先響應button上的事件在響應div上的事件,最後響應body上的事件;

而“事件捕獲流”認為是從外向裡流: 先響應body上的事件,在響應div上的,最後響應button上的事件。

大部分瀏覽器預設的都是事件源冒泡流的方式來響應事件(自然是在事件冒泡階段做出響應),不過瀏覽器也都支援“事件捕獲流”的方式(支援在捕獲階段響應事件),需要我們手動設定,怎麼設定那??

可以用“事件監聽”方式繫結時間的時候來設定

例如: button.addEventListener(“click”,function( ){....},false);

將第三個引數設定為true,就表示在“捕獲階段”響應事件,此時事件流就是從外向裡流的(先響應body上的事件,在響應div上的,最後響應button上的事件。

),關於繫結事件的幾種方式請參考我的另一篇文章《JS事件之事件繫結