阻止事件传播:stopPropagation()方法和cancelBubble
1. cancelBubble属性
如果事件对象的cancelBubble
属性被设置为true
, 则会阻止事件继续向上冒泡(也可以阻止事件的捕获)。
举例:
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
window.onload = function(){
let div1 = document.getElementById("div1");
let div2 = document.getElementById("div2");
div1.addEventListener(
"click",
()=>{
console.log("this is div1");
},
false
);
div2.addEventListener(
"click",
function(){
console.log("this is div2");
},
false
);
document.onclick = ()=>{
console.log("this is html");
};
};
</script>
</head>
<body>
<div id="div1">
<div id="div2" style="height:30px; background-color: #ff7f27;">
</div>
</div>
</body>
</html>
现在,如果想要在冒泡到div1
之后,停止冒泡,则可以在div1
绑定的回调函数中,将事件对象的cancelBubble
属性置为true
来阻止事件向上冒泡。
div1.addEventListener(
"click",
event=>{
console.log("this is div1");
event.cancelBubble = true;
},
false
);
div2
的事件触发时,执行div2
的回调函数之后,由于事件对象的cancelBubble
属性为false(默认值),事件向上冒泡,触发div1
的事件;div1
的回调函数将事件对象的cancelBubble
属性置为true
,回调函数执行完成后,由于cancelBubble
为true
,阻止事件冒泡。
2. stopPropagation()
Event.stopPropagation()
也可以用来取消事件冒泡,使用也很简单,在设置cancelBubble
为true
的位置,调用该方法可以起到相同作用。
div1.addEventListener(
"click",
event=>{
console.log("this is div1");
event.stopPropagation();
},
false
);
3. 最早的作用阶段:捕获阶段
上面两个方法,最早可以作用于捕获阶段。
也就是说,捕获过程中,cancelBubble
属性为true
,就会停止捕获;同样,如果在捕获过程中,调用了stopPropagation()
也会停止捕获。
停止捕获后,也不会继续冒泡。
div1.addEventListener(
"click",
event=>{
console.log("this is div1");
},
false
);
div1.addEventListener(
"click",
event=>{
console.log("capture : this is div1");
event.cancelBubble = true;
},
true
);
div2.addEventListener(
"click",
function(){
console.log("this is div2");
},
false
);
div2.addEventListener(
"click",
function(){
console.log("capture : this is div2");
},
true
);
document.onclick = ()=>{
console.log("this is html");
};
document.addEventListener(
"click",
function(){
console.log("capture : this is document");
},
true
);
在捕获到div1
时,执行捕获过程的回调函数,将cancelBubble
置为true
,停止捕获,不会捕获div2
,同时也不会冒泡,实现了阻止事件的传播。