在我的上一篇博客里,为大家总结了事件代理的用法,传送门: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.οnlοad=function(){
var oDiv=document.getElementById('A');
var oSpan=document.getElementById('B');
oDiv.οnclick=function(ev){
var oEvent=ev||event;
oDiv.style.display='none';
}
oSpan.οnclick=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();也是一样的~