深入理解JS DOM事件機(jī)制
1、事件流
html 元素觸發(fā)事件的順序。
2、事件冒泡IE的事件流叫做事件冒泡(event bubbling),即事件開始時由最具體的元素(文檔中嵌套層次最深的那個節(jié)點(diǎn))接收,然后逐級向上傳播到較為不具體的節(jié)點(diǎn)(文檔)。3、事件捕獲事件捕獲的思想是不太具體的節(jié)點(diǎn)應(yīng)該更早的接收到事件,而最具體的節(jié)點(diǎn)應(yīng)該在最后接收到節(jié)點(diǎn)。事件捕獲的用意在于事件到達(dá)預(yù)定目標(biāo)之前捕獲它。
DOM事件流
“DOM2級事件流”規(guī)定的事件流包括三個階段:事件捕獲階段、處于目標(biāo)階段和冒泡階段。首先發(fā)生的是事件捕獲,為截獲事件提供了機(jī)會。然后是實(shí)際的目標(biāo)接收到事件。最后一個階段是冒泡階段,可以在這個階段對事件作出響應(yīng)。以簡單的HTML頁面為例,單擊<div>元素會按照下圖順序觸發(fā)事件。
在DOM事件流中,實(shí)際的目標(biāo)(<div>元素)在捕獲階段不會接收到事件。這意味著在捕獲階段,事件從document到<html>再到<body>后就停止了。下一個階段是“處于目標(biāo)”階段,于是事件在<div>上發(fā)生,并在事件處理中被看成冒泡階段的一部分。然后冒泡階段發(fā)生,事件又傳播回文檔。
多數(shù)支持DOM事件流的瀏覽器都實(shí)現(xiàn)了一種特定行為;即使“DOM2級事件”規(guī)范明確要求捕獲階段不會涉及事件的目標(biāo),但Safari、Chrome、Firefox和Opera9.5及更高版本都會在捕獲階段觸發(fā)事件對象上的事件。結(jié)果,就是有兩個機(jī)會在目標(biāo)對象上面操作事件。
阻止事件冒泡
實(shí)驗(yàn)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
function onBtn() {
alert('button');
//cancelBubble(); 阻止事件冒泡
}
//獲取事件對象
function getEvent(){
//如果為ie或chrome
if(window.event){return window.event;}
//針對firefox
func = getEvent.caller; //獲取函數(shù)調(diào)用者
while(func != null){
var arg0 = func.arguments[0]; //獲取調(diào)用者第一個參數(shù)
//判斷參數(shù)是否為空
if(arg0){
//判斷arg0是否為事件對象
if((arg0.constructor == Event || arg0.constructor == MouseEvent
|| arg0.constructor == KeyboardEvent)
||(typeof(arg0) == "object" && arg0.preventDefault
&& arg0.stopPropagation)){
return arg0;
}
}
//獲取func調(diào)用者
func = func.caller;
}
return null;
}
//阻止事件冒泡
function cancelBubble() {
event = getEvent();
// Firefox chrome
if(event.preventDefault) {
event.preventDefault();
event.stopPropagation();
} else {
//ie
event.cancelBubble=true;
event.returnValue = false;
}
}
</script>
</head>
<body onclick="alert('body')">
<div onclick="alert('div');" style="background-color:green">
<button onclick="onBtn()">dsd</button>
</div>
</body>
</html>
上面的html代碼執(zhí)行的事件觸發(fā)順序。
默認(rèn)情況: 依次會彈出 'button' ---》 彈出'div' -----》彈出'body'
如果加上cancelBubble()代碼:只會彈出'button'
以上這篇深入理解JS DOM事件機(jī)制就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JS中new?Blob()詳解及blob轉(zhuǎn)file示例
這篇文章主要給大家介紹了關(guān)于JS中new?Blob()詳解及blob轉(zhuǎn)file的相關(guān)資料,Blob?Blob(Binary?Large?Object)表示二進(jìn)制類型的大對象,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
微信小程序?qū)崿F(xiàn)事件傳參與數(shù)據(jù)同步流程詳解
這篇文章主要介紹了微信小程序開發(fā)中實(shí)現(xiàn)事件傳參與數(shù)據(jù)同步的詳細(xì)流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10
js中用window.open()打開多個窗口的name問題
這篇文章主要介紹了js中用window.open()打開多個窗口的問題,需要的朋友可以參考下2014-03-03
原生js實(shí)現(xiàn)點(diǎn)擊按鈕復(fù)制內(nèi)容到剪切板
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)點(diǎn)擊按鈕復(fù)制內(nèi)容到剪切板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-11-11
layui table 復(fù)選框跳頁后再回來保持原來選中的狀態(tài)示例
今天小編就為大家分享一篇layui table 復(fù)選框跳頁后再回來保持原來選中的狀態(tài)示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
用javascript替換URL中的參數(shù)值示例代碼
本篇文章主要是對用javascript替換URL中的參數(shù)值示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01
javascript中關(guān)于執(zhí)行環(huán)境的雜談
如你所知,javascript里執(zhí)行環(huán)境是作為一個最核心的概念存在的。相信廣大FE筒子們對于這個概念不會陌生,它定義了變量或函數(shù)有權(quán)訪問其他數(shù)據(jù)范圍以及其行為。2011-08-08

