事件
事件(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) 也是如此。把原本绑定在子元素上的事件委托给父元素,父元素监听子元素的冒泡事件,就可以方便的触发子元素的事件了。