DOM事件模型简单了解

108 阅读2分钟

对事件(event)的描述,MDN是这样说的:

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

在浏览器中,事件的顺序会以两种方式来运行(也称作事件流),分别是IE提出的事件冒泡和Netscape提出的事件捕获。这两种方案是完全相反的顺序,接下来我们简单来了解一下。

事件冒泡与事件捕获

事件冒泡是从内向外来找监听函数的。
事件捕获是从外到内来找监听函数的。
假设如下代码中有一个click函数。

<div>
    <p>
        <span></span>
    </p>
</div>

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

event.addEventLIstener(‘click’,fn,bool)

使用如上方法就可以选择事件响应在什么阶段。最后的参数是一个bool值,可以选择使用事件冒泡或是事件捕获。当bool值为false时,使用事件捕获,默认为false;当值为true时,使用事件冒泡。