jQuery

jQuery 知识量:7 - 32 - 105

3.4 事件的旅程><

事件捕获与事件冒泡- 3.4.1 -

由于DOM元素结构中存在普遍的嵌套现象(父元素总是包含许多子元素),因此当某个事件发生时,涉及到的每个层次上的DOM元素理论上都有机会处理这个事件,这个事件处理过程就是事件的旅程。这个旅程可以分为两种:事件捕获和事件冒泡。

1、事件捕获

事件捕获过程中,事件首先由最外层元素处理,然后由外到内依次交给更具体的元素处理。

<div>
    <p>
        <a>look</a>
    </p>
</div>

以上代码中,如果点击a,事件将首先由div处理,然后由p处理,最后由a处理。

2、事件冒泡

事件冒泡过程中,事件首先由最具体的元素处理,然后由内到外依次交给更外面的元素处理。可以看出事件冒泡的事件处理顺序与事件捕获正好相反。

以上面代码为例,如果点击a,事件将首先由a处理,然后由p处理,最后由div处理。

DOM标准规定在事件处理过程中,应该同时使用事件捕获和事件冒泡两种策略,先是事件捕获过程,接着是事件冒泡过程。jQuery始终在事件冒泡阶段注册程序,所以可以认为总是最具体的元素首先获得处理事件的机会。

事件冒泡的副作用- 3.4.2 -

事件冒泡机制有时会带来副作用。假设在父元素上定义了一个事件,那么即使父元素本身没有触发该事件,只要其某个子元素满足触发条件,父元素的事件还是会触发,因为事件冒泡机制会将子元素的事件传递到父元素,从而触发事件。

HTML代码如下:

<div>
    <p>
        <a>look</a>
    </p>
</div>

对应的JavaScript代码如下:

$(document).ready(function () {
    $('div').click(function () {
        alert('oh!')
    });
});

上面示例中,div绑定了一个click事件,即使不点击div,但是当a被点击后,因为事件冒泡,click事件仍会触发。因此,限制事件作用域是十分必要的。

需要注意,标准DOM事件方法(简单事件方法)通常存在事件冒泡副作用问题,而jQuery自定义方法(复合事件方法)一般可以避免以上事件冒泡问题。