本文整理下 DOM 事件模型的知识。
DOM 事件模型是为了解决页面中事件流(发生顺序)的问题而产生的。有事件捕获和事件冒泡两种模式,分别由网景和微软公司提出。
<div id="outer">
<p id="inner">Click me!</p>
</div>
微软提出的是事件冒泡(event bubbling)的解决方案。对于冒泡,它的发生顺序是这样的:
p -> div -> body -> html -> document
与事件冒泡相反的是,事件捕获(event capturing)从最外层再到最里层:
document -> html -> body -> div -> p
1-5 是捕获过程,5-6 是目标阶段,6-10 是冒泡阶段。
DOM2 级事件中规定的事件流同时支持了事件捕获阶段和事件冒泡阶段,而作为开发者,我们可以选择事件处理函数在哪一个阶段被调用。
JavaScript 中使用 addEventListener 方法用来为一个特定的元素绑定一个事件处理函数。addEventListener有三个参数:
element.addEventListener(event, function, useCapture)
其中 useCapture:
在实际的开发当中,利用事件流的特性,我们可以使用一种叫做事件代理的方法。
<ul class="color_list">
<li>red</li>
<li>orange</li>
<li>yellow</li>
<li>green</li>
<li>blue</li>
<li>purple</li>
</ul>
<div class="box"></div>
假设这么一个 list,如果给每一个 li 绑定一个响应函数,那么一旦 list 复杂的情况下,造成性能损耗。这种时候可以使用事件代理,把事件的管理收口到父层的元素上,统一管理。
function colorChange(e){
var e=e||window.event;//兼容性的处理
if(e.target.nodeName.toLowerCase()==="li"){
box.innerHTML="该颜色为 "+e.target.innerHTML;
}
}
color_list.addEventListener("click",colorChange,false)
利用事件冒泡机制,可以将子层元素的事件冒泡到父层上,利用 e.target 找到事件实际发生的元素,就可以达到预期的效果。