JavaScript的那些坑之事件冒泡

来源:互联网 发布:ubuntu java环境搭建 编辑:程序博客网 时间:2024/06/11 09:56

在我的上一篇博客里,为大家总结了事件代理的用法,传送门:JavaScript的那些坑之事件代理。

既然提到了事件,那么就不得不提到事件冒泡,这可是许多bug的罪魁祸首。

事件捕获和事件冒泡

让我们再重温一下事件捕获和事件冒泡,

事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target)。

事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。

addEventListener

这里不得不提到一个方法

绑定事件的对象方法;addEventListener();(IE8浏览器下是attachEvent();IE9及以上可以兼容addEventListener();)

addEventListener()里含有三个参数,一个是事件名称(event),第二个是事件执行的函数(function),最后一个是事件捕获(true/false)。

最后一个参数的true就代表着事件捕获,false就代表着时间冒泡。

例如:obj.addEventListener("onclick",function(){},true/false);注意:写事件名时候要加上"on"前缀("onload"、"onclick"等)。


阻止事件冒泡

事件冒泡是很容易出bug的,比如divA中有一个spanB,两个容器都有各自的onclick事件,但是触发spanB的onclick事件时候会自动冒泡,也会触发到divA的onclick事件,如果你不想触发divA的onclick事件的话,就需要阻止事件冒泡。就像下面的例子一样。
<!doctype html><html><head><meta charset="UTF-8"><meta http-equiv="Content-Type" content="text/html;charset=gb2312" /><title>事件冒泡</title><style type="text/css">#A{width: 200px;height: 200px;background-color: red;position: relative;}#B{width: 100px;height: 100px;background-color: green;position: absolute;}</style><script type="text/javascript">window.onload=function(){var oDiv=document.getElementById('A');var oSpan=document.getElementById('B');oDiv.onclick=function(ev){var oEvent=ev||event;oDiv.style.display='none';}oSpan.onclick=function(ev){var oEvent=ev||event;oSpan.style.display='none';stopEventBubble(oEvent);}//阻止事件冒泡的函数function stopEventBubble(event){var e=event || window.event;if (e && e.stopPropagation){e.stopPropagation();    }else{e.cancelBubble=true;}}}</script></head><body><div id="A"><span id="B"></span></div></body></html>

这就可以阻止span的onclick事件冒泡到div上,
如果去掉oSpan的onclick函数中的stopEventBubble(oEvent);这句话就会没有阻止事件冒泡,什么后果,大家也都能猜得出来把~




阻止事件冒泡不仅仅可以采用stopPropagation();方法,还可以采用preventDefault();方法阻止浏览器的默认事件,用法和stopPropagation();也是一样的~

0 0
原创粉丝点击