深入理解事件冒泡(Bubble)和事件捕捉(capture)
事件的發(fā)生順序
假設(shè)在一個元素中又嵌套了另一個元素并且兩者都有一個onClick事件處理函數(shù)(event handler)。如果用戶單擊元素2,則元素1和元素2的單擊事件都會被觸發(fā)。但是哪一個事件先被觸發(fā)?哪一個事件處理函數(shù)會被首先執(zhí)行?換句話說,事件的發(fā)生順序到底如何?如下圖是當點擊span元素區(qū)域是,三個點擊事件都會被觸發(fā),但是先后順序是怎樣的呢?
<div onclick="func1"> <p onclick="func2"> <span onclick=""func3> </span> </p> </div>
兩種模型
對于這個事件的處理順序上,Netscape和微軟有兩種截然不同的處理方法:
•Netscape主張事件會從最外層開始發(fā)生,直到最具體的元素,這種事件發(fā)生順序被稱為捕獲型
•微軟則保持事件從最內(nèi)部元素開始發(fā)生,然后一直向上傳播,這種事件順序被稱為冒泡型
這兩種事件順序是截然相反的。Explorer瀏覽器只支持冒泡事件,Mozilla,Opera7和Konqueror兩者都支持。而更古老的opera和iCab兩者都不支持
w3c
任何發(fā)生在w3c事件模型中的事件,首是進入捕獲階段,直到達到目標元素,再進入冒泡階段。
對于正常的web開發(fā),可以選擇是在捕獲階段還是冒泡階段綁定事件處理函數(shù),這是通過addEventListener()方法實現(xiàn)的,如果這個函數(shù)的useCapture參數(shù)是true,則在捕獲階段綁定函數(shù),反之false,在冒泡階段綁定函數(shù)。
element.addEventListener(event, function, useCapture)
阻止冒泡
在正常的開發(fā)過程中,如果想要阻止事件的傳播,通過一個方法實現(xiàn)。
在微軟的模型中,你必須設(shè)置事件的cancelBubble的屬性為true
window.event.cancelBubble = true
在w3c模型中你必須調(diào)用事件的stopPropagation()方法
e.stopPropagation()
通過調(diào)用這些方法會阻止所有冒泡向外傳播。跨瀏覽器解決方案:
function doSomething(e) { if (!e) { var e = window.event; e.cancelBubble = true; } if (e.stopPropagation) { e.stopPropagation(); } }
以上這篇深入理解事件冒泡(Bubble)和事件捕捉(capture)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
用JS操作FRAME中的IFRAME及其內(nèi)容的實現(xiàn)代碼
一直都需要這樣的東西,發(fā)現(xiàn)了這個好東西,一定要研究下2008-07-07JS實現(xiàn)iframe中子父頁面跨域通訊的方法分析
這篇文章主要介紹了JS實現(xiàn)iframe中子父頁面跨域通訊的方法,結(jié)合實例形式分析了JS實現(xiàn)iframe頁面跨域通訊常見操作技巧與相關(guān)注意事項,需要的朋友可以參考下2020-03-03兩種方法實現(xiàn)在HTML頁面加載完畢后運行某個js
這篇文章主要介紹了通過兩種方法實現(xiàn)在HTML頁面加載完畢后運行某個js,需要的朋友可以參考下2014-06-06List the UTC Time on a Computer
List the UTC Time on a Computer...2007-06-06原生js和jQuery隨意改變div屬性style的名稱和值
用原生js和jQuery實現(xiàn)改變隨意改變div屬性style的名稱和值的結(jié)果,這個實例比較實用,新手朋友們可以看看2014-10-10