1. 程式人生 > 其它 >冒泡和捕獲事件詳細介紹 [原]

冒泡和捕獲事件詳細介紹 [原]

<!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" 引數來設定傳遞型別:

addEventListener(event,function,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);
.

參考

[轉]addEventListener() 方法,事件監聽==>https://www.cnblogs.com/jackson0714/p/7604019.html 感覺空虛寂寞,只是因為你無所關注,無處付出。