事件冒泡和事件捕获
1. 事件冒泡
1.1 简介
即事件由子元素向父元素传播,就像气泡从水底向水面上浮一样。
<div id='div' onclick='alert("div");'> <ul onclick='alert("ul");'> <li onclick='alert("li");'>test</li> </ul> </div>
上面的代码,我们单击 test 时,会依次触发 alert(“li”), alert(“ul”), alert(“div”),这就是事件冒泡。
1.2 如何取消事件冒泡
防止冒泡和捕获:
w3c 的方法是 e.stopPropagation(),IE 则是使用 e.cancelBubble = true
当需要停止冒泡时,可以使用
function stopBubble(e) { //如果提供了事件对象,则这是一个非IE浏览器 if ( e && e.stopPropagation ) //因此它支持W3C的stopPropagation()方法 e.stopPropagation(); else //否则,我们需要使用IE的方式来取消事件冒泡 window.event.cancelBubble = true; }
取消默认事件:
w3c的方法是e.preventDefault(),IE则是使用e.returnValue = false;
当需要阻止默认行为时,可以使用
//阻止浏览器的默认行为 function stopDefault( e ) { //阻止默认浏览器动作(W3C) if ( e && e.preventDefault ) e.preventDefault(); //IE中阻止函数器默认动作的方式 else window.event.returnValue = false; return false; }
2. 事件捕获
事件捕获是一个和冒泡阶段完全相反的过程,即事件由父元素向子元素传播。要说明的是,在 IE 浏览器中是不存在这个阶段的。
在 DOM 标准事件模型中,是先捕获后冒泡,但是如果要实现先冒泡后捕获的效果,对于同一个事件,监听捕获和冒泡,分别对应相应的处理函数,监听到捕获事件,先暂缓执行,直到冒泡事件被执行后再执行捕获事件。