DOM事件与事件委托

105 阅读2分钟

事件

事件(event)是您在编程时系统内发生的动作或者发生的事情,系统响应事件后,如果需要,您可以某种方式对事件做出回应。例如:如果用户在网页上单击一个按钮,您可能想通过显示一个信息框来响应这个动作。

在浏览器中,事件的顺序会以两种方式来运行(也称作事件流),分别是IE提出的事件冒泡和Netscape提出的事件捕获

  • 从外向内找监听函数,叫做事件捕获
  • 从内向外找监听函数,叫做事件冒泡
<div>
    <p>
        <span></span>
    </p>
</div>

事件冒泡的顺序是:span => p => div 。也就是说span元素最先触发click事件,其次是p,最后是div,由最里面向外面扩散。
事件捕获的顺序是相反的:div => p => span 。由最外层的div元素先触发click事件,然后依次向里面推。
目前绝大部分的浏览器都会冒泡到window对象层面,也是从window对象开始捕获的。
在DOM2 Events规范中,规定了事件流由3个阶段:事件捕获、到达目标和事件冒泡。也就是说事件捕获是最先发生的,不过实际的目标在捕获阶段不会接受到事件,一般事件处理被认为是冒泡阶段的一部分。
但是在浏览器中,在捕获阶段就会触发事件,所以开发者可以自己选择把事件放在捕获阶段还是冒泡阶段。
addEventListene

event.addEventListener('click',fn,bool)

事件绑定API:

  • IE5: baba.attachEvent('onclick',fn)            冒泡
  • 网景:baba.addEventListener('click',fn)      捕获
  • W3C:baba.addEventListener('click',fn,bool)

如果bool不传或为false值,就让fn走冒泡,即当浏览器在冒泡阶段发现有fn监听函数,就会调用fn,并提供事件信息如果bool为true,就让fn走捕获
捕获总在冒泡之前执行

事件委托

你要给 100 个按钮添加点击事件,怎么办?
监听这 100 个按钮的祖先,等冒泡的时候判断 target 是不是这 100 个按钮中的一个 你要监听目前不存在的元素的点击事件,咋办?
答:监听祖先,等点击的时候看看是不是我想要监听的元素即可

事件委托(Event Delegation) 也是如此。把原本绑定在子元素上的事件委托给父元素,父元素监听子元素的冒泡事件,就可以方便的触发子元素的事件了。