js 冒泡事件与解决冒泡事件
程序员文章站
2022-05-03 11:37:33
事件冒泡 :当一个元素接收到事件的时候 会把他接收到的事件传给自己的父级,一直到window 。 html代码: 代码很简单,就是三个父子关系的div,然后分别加了点击事件,当我们在div3里面点击的时候,会发现弹出了一次3,接着又弹出了2,最后又弹出了1,这说明点击的时候,不仅div3的事件被触发 ......
事件冒泡 :当一个元素接收到事件的时候 会把他接收到的事件传给自己的父级,一直到window 。
html代码:
<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) };