首先普及事件流知识,所谓事件流指的是页面接收事件的先后顺序。
先说说事件流为什么会分为事件冒泡和事件捕获吧。就是在第四代浏览器(IE4和Netscape4)在处理事件流时候提出了相反的概念,即现在的IE是事件冒泡,Netscape是事件捕获。是不是有点晕好吧,继续有例子。
概念:
事件冒泡:事件最开始由最具体的元素接收(文档层次中嵌套最深的那个节点),然后逐级向上传播最不具体的节点(document)。
事件捕获:事件由最不具体的元素接收,最后传播至最具体的元素。
事件冒泡代码实例:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>事件冒泡</title> </head> <body> <div id="e"> <input id="btn" type="button" value="按钮"> </div> <script type="text/javascript"> var e = document.getElementById('e'); var btn = document.getElementById('btn'); e.onclick = function (){ alert("你点击了div"); }; btn.onclick = function(){ alert("你点击了button"); } </script> </body> </html>当我点击了按钮时候,运行结果图:
①先出现
②再出现
是不是很诧异怎么会出现这种结果,没错,这就是因为事件冒泡的原因。
冒泡的顺序为:input->div->body->html->document,(仅是IE5.5及其以前)、IE9和safari,chrome,firefox,opera会冒泡到windows对象、
也就是说,在他的上层只要有事件就会被触发,所以,我们要防止事件冒泡,后面马上讲。
事件捕获是Nerscape唯一支持的事件模型,但是IE9和safari,chrome,firefox,opera也都支持事件捕获模型。由于老版本浏览器不支持事件捕获,所以很少有人用事件捕获,所以一般不考虑。
事件捕获代码:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>事件冒泡</title> </head> <body> <div id="e"> <input id="btn" type="button" value="按钮"> </div> <script type="text/javascript"> var e = document.getElementById('e'); var btn = document.getElementById('btn'); e.addEventListener('click',function(){ alert('你点击了div'); },true); btn.addEventListener('click',function(){ alert('你点击了button'); },true); </script> </body> </html>运行结果图:
①先出现
所以事件捕获只做了解就行了。
事件冒泡处理方案:
function(event){ if(event.stopPropagation){ event.stopPropagation(); }else{ event.cancelBubble = true;//IE阻止事件冒泡,true代表阻止 } },
好了。