在我的上一篇博客里,为大家总结了事件代理的用法,传送门:JavaScript的那些坑之事件代理。
既然提到了事件,那么就不得不提到事件冒泡,这可是许多bug的罪魁祸首。
让我们再重温一下事件捕获和事件冒泡,
事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target)。
事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。
这里不得不提到一个方法
绑定事件的对象方法;addEventListener();(IE8浏览器下是attachEvent();IE9及以上可以兼容addEventListener();)
addEventListener()里含有三个参数,一个是事件名称(event),第二个是事件执行的函数(function),最后一个是事件捕获(true/false)。
最后一个参数的true就代表着事件捕获,false就代表着时间冒泡。
例如:obj.addEventListener("onclick",function(){},true/false);注意:写事件名时候要加上"on"前缀("onload"、"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>
阻止事件冒泡不仅仅可以采用stopPropagation();方法,还可以采用preventDefault();方法阻止浏览器的默认事件,用法和stopPropagation();也是一样的~