1、事件流
html 元素觸發事件的順序。
2、事件冒泡IE的事件流叫做事件冒泡(event bubbling),即事件開始時由最具體的元素(文檔中嵌套層次最深的那個節點)接收,然後逐級向上傳播到較為不具體的節點(文檔)。3、事件捕獲事件捕獲的思想是不太具體的節點應該更早的接收到事件,而最具體的節點應該在最後接收到節點。事件捕獲的用意在於事件到達預定目標之前捕獲它。
DOM事件流
“DOM2級事件流”規定的事件流包括三個階段:事件捕獲階段、處於目標階段和冒泡階段。首先發生的是事件捕獲,為截獲事件提供了機會。然後是實際的目標接收到事件。最後一個階段是冒泡階段,可以在這個階段對事件作出響應。以簡單的HTML頁面為例,單擊<div>元素會按照下圖順序觸發事件。
在DOM事件流中,實際的目標(<div>元素)在捕獲階段不會接收到事件。這意味著在捕獲階段,事件從document到<html>再到<body>後就停止了。下一個階段是“處於目標”階段,於是事件在<div>上發生,並在事件處理中被看成冒泡階段的一部分。然後冒泡階段發生,事件又傳播回文檔。
多數支持DOM事件流的浏覽器都實現了一種特定行為;即使“DOM2級事件”規范明確要求捕獲階段不會涉及事件的目標,但Safari、Chrome、Firefox和Opera9.5及更高版本都會在捕獲階段觸發事件對象上的事件。結果,就是有兩個機會在目標對象上面操作事件。
阻止事件冒泡
實驗
<!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; //獲取函數調用者 while(func != null){ var arg0 = func.arguments[0]; //獲取調用者第一個參數 //判斷參數是否為空 if(arg0){ //判斷arg0是否為事件對象 if((arg0.constructor == Event || arg0.constructor == MouseEvent || arg0.constructor == KeyboardEvent) ||(typeof(arg0) == "object" && arg0.preventDefault && arg0.stopPropagation)){ return arg0; } } //獲取func調用者 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代碼執行的事件觸發順序。
默認情況: 依次會彈出 'button' ---》 彈出'div' -----》彈出'body'
如果加上cancelBubble()代碼:只會彈出'button'
以上這篇深入理解JS DOM事件機制就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。