冒泡和捕獲事件詳細介紹 [原]
阿新 • • 發佈:2022-01-28
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>addEventListener事件</title> </head> <body> 預設值為 false, 即冒泡傳遞 <div id="outer" style="width:500px;height:200px;margin:100px auto;border:1px solid #ccc;"> 外面 <div id="middle" style="width:300px;border:1px solid #ccc;margin: 20px auto;height:100px"> 中間 <div id="inner" style="width:200px;border:1px solid #ccc;margin: 20px auto;"> 裡面 </div> </div> </div> <div id="demo" style="width:500px;height:200px;margin:100px auto;border:1px solid #ccc;"></div> <script> var p1 = 5; var p2 = 7; document.getElementById("inner").addEventListener("click", function(e) { e.stopPropagation(); console.log("裡面 "); myFunction("裡面 "); },true); document.getElementById("middle").addEventListener("click", function(e) { e.stopPropagation(); console.log("中間 "); myFunction("中間 "); },false); document.getElementById("outer").addEventListener("click", function(e) { e.stopPropagation(); console.log("外面 "); myFunction("外面 "); },true); function myFunction(info) { var htmlData = document.getElementById("demo").innerHTML; htmlData = htmlData + info; document.getElementById("demo").innerHTML = htmlData; } </script> </body> </html>
事件傳遞有兩種方式:冒泡與捕獲。
事件傳遞定義了元素事件觸發的順序。 如果你將 <p> 元素插入到 <div> 元素中,使用者點選 <p> 元素, 哪個元素的 "click" 事件先被觸發呢?
在冒泡中,內部元素的事件會先被觸發,然後再觸發外部元素,即: <p> 元素的點選事件先觸發,然後會觸發 <div> 元素的點選事件。
在捕獲中,外部元素的事件會先被觸發,然後才會觸發內部元素的事件,即: <div> 元素的點選事件先觸發 ,然後再觸發 <p> 元素的點選事件。
addEventListener() 方法可以指定 "useCapture" 引數來設定傳遞型別:
預設值為false, 即冒泡傳遞,當值為true 時, 事件使用捕獲傳遞。
document.getElementById("myDiv").addEventListener("click", myFunction, true);
瀏覽器相容處理
var x = document.getElementById("myBtn"); if (x.addEventListener) { // 所有主流瀏覽器,除了 IE 8 及更早版本 x.addEventListener("click", myFunction); } else if (x.attachEvent) { // IE 8 及更早版本 x.attachEvent("onclick", myFunction); }
IE 8 及更早 IE 版本,Opera 7.0及其更早版本不支援 addEventListener() 和 removeEventListener() 方法。但是,對於這類瀏覽器版本可以使用 detachEvent() 方法來移除事件控制代碼:
element.attachEvent(event, function);
element.detachEvent(event, function);
.