js 冒泡事件与解决冒泡事件
原创
©著作权归作者所有:来自51CTO博客作者wx6332e0803afcf的原创作品,请联系作者获取转载授权,否则将追究法律责任
事件冒泡 :当一个元素接收到事件的时候 会把他接收到的事件传给自己的父级,一直到window 。
代码:
<div id="div1">
<div id="div2">
<div id="div3">
</div>
</div>
</div>
<style>
#div1{
width: 300px;
height: 200px;
background-color: red;
}
#div2{
width: 250px;
height: 150px;
background-color: green;
}
#div3{
width: 200px;
height: 100px;
background-color: blue;
}
</style>
my$("div1").onclick=function () {
console.log(this.id);
};//div3 div2 div1
my$("div2").onclick=function () {
console.log(this.id);
};//div2 div1
my$("div3").onclick=function () {
console.log(this.id);
};//div1
代码很简单,就是三个父子关系的div,然后分别加了点击事件,当我们在div3里面点击的时候,会发现弹出了一次3,接着又弹出了2,最后又弹出了1,这说明点击的时候,不仅div3的事件被触发了,它的父级div2 与div1的点击事件也触发了,这种现象就叫做冒泡。
取消事件冒泡有两种方式:
1、标准的W3C 方式:e.stopPropagation(); 这里的stopPropagation是标准的事件对象的一个方法,调用即可(谷歌和火狐支持,IE不支持)
my$("div3").onclick=function (e) {
console.log(this.id);
e.stopPropagation();
};
2、非标准的IE方式:window.event.cancelBubble=true; 这里的cancelBubble是 IE事件对象的属性,设为true就可以了(IE特有的,谷歌支持,火狐不支持)
my$("div2").onclick=function () {
console.log(this.id);
window.event.cancelBubble=true;
};
为了兼容解决事件冒泡的方式:
function stopBubble(e) {
//如果提供了事件对象,则这是一个非IE浏览器
if (e && e.stopPropagation)
//因此它支持W3C的stopPropagation()方法
e.stopPropagation();
else
//否则,我们需要使用IE的方式来取消事件冒泡
window.event.cancelBubble = true;
}
my$("div2").onclick = function (e) {
console.log(this.id);
stopBubble(e)
};
my$("div3").onclick = function (e) {
console.log(this.id);
stopBubble(e)
};