DOM事件流解析

什么是事件流?

事件流:描述的就是從頁面中接受事件的順序。分有事件冒泡與事件捕獲兩種。

什么是事件冒泡?

事件冒泡即事件開始時,由最具體的元素接收(也就是事件發(fā)生所在的節(jié)點),然后逐級傳播到較為不具體的節(jié)點。

什么是事件捕獲?

事件捕獲的概念,與事件冒泡正好相反。它認為當某個事件發(fā)生時,父元素應(yīng)該更早接收到事件,具體元素則最后接收到事件。

明白了上面的三個概念基本上就弄懂了DOM的事件流了,下面來徹底明白事件流。

DOM事件流的三個階段:

  1. 事件捕獲階段(為截獲事件提供了機會)
  2. 處于目標階段
  3. 事件冒泡階段(對事件作出響應(yīng))

當一個DOM事件觸發(fā)時,它不是在觸發(fā)的對象上只觸發(fā)一次的,而是經(jīng)歷上述的三個階段,即開始從文檔的根節(jié)點流向目標對象,然后在目標對向上被觸發(fā),之后再回溯到文檔的根節(jié)點。

來個實例:

var button = document.getElementById('clickMe');

button.onclick = function() {
  console.log('1. You click Button');
};
document.body.onclick = function() {
  console.log('2. You click body');
};
document.onclick = function() {
  console.log('3. You click document');
};
window.onclick = function() {
  console.log('4. You click window');
};

把window點擊事件更改為使用事件捕獲模式

window.addEventListener('click', function() {
   console.log('4. You click window');
 }, true);//true代表使用事件捕獲模式,alse則表示使用事件冒泡模式

輸出為4->1->2->3點擊事件先被父元素截獲了,且該函數(shù)只在事件捕獲階段起作用。

阻止事件冒泡:
stopPropagation()防止事件冒泡而帶來不必要的錯誤和困擾。

button.addEventListener('click', function(event) {
   // event為事件對象
   console.log('1. You click Button');
   event.stopPropagation();
   console.log('Stop Propagation!');
 }, false);

輸出為4->1,事件在到達具體元素后,停止了冒泡。但不影響父元素的事件捕獲。

本文參考:http://www.cnblogs.com/LIUYANZUO/p/5332583.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容