Javascript中的事件冒泡与捕获

2021-02-22  本文已影响0人  JJesson

事件冒泡和事件捕获

起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支持第三个参数,useCapture:是否使用事件捕获,觉得有点模糊


    <!-- 假如有这样一段相同的html -->
    <!DOCTYPE html>
    <html>
        <head><title>bubbling and capture</title></head>
        <body>
            <div id="myDiv">Click me</div>
        </body>
    </html>
* `DOM2级事件处理程序`

    两个方法:`addEventListener`和`removeEventListener`

    所有的`DOM`节点都包含这两个方法,并且接受三个参数,要处理的事件名,作为事件处理函数的函数和一个布尔值,最后这个布尔值如果是`true`,表示在**捕获阶段调用事件处理程序**,如果是`false`则表示在**冒泡阶段调用事件处理程序**

    而事件流的顺序是**捕获-目标-冒泡,捕获阶段会在冒泡事件处理之前,所以改为`true`的话有可能会影响正常的时间顺序**

    demo如下:

    ```js
        var btn = document.getElementById('myBtn')
        btn.addEventListener('click',function(){
            alert(this.id)
        },false)

    ```

    **DOM2级方法添加事件处理程序的好处是可以添加多个事件处理程序,而前两个则是会替换掉事件处理程序,因为属性只有一个,而元素的方法也会重写**

    但是也意味着,不能通过重写来移除事件处理程序,所以通过`removeEventListener`来移除事件处理程序,并且匿名函数无法移除

    **大多数情况下,都是将事件处理程序添加到事件流的冒泡阶段,这样可以最大限度的兼容各种浏览器,最好只在需要在事件到达目标之前截获它的时候将事件处理程序添加到捕获阶段,如果不是特别需要,不建议在时间捕获阶段注册事件处理程序**

* IE事件处理程序

    IE中实现了与`DOM`中类似的两个方法`attachEvent`和`detachEvent`,但是仅接受两个参数,一个是事件处理程序名称与事件处理函数,由于`IE8`以及更早的版本只支持事件冒泡,所以通过`attachEvent`添加的事件处理程序都会被添加到**事件冒泡阶段**

    **需要注意的是:**

    **1.`attachEvent`和DOM级方法主要区别在事件处理程序的作用域,DOM0级会在所属元素的作用域内,而`attachEvent`事件处理程序会在全局作用域中运行,因此在attachEvent添加的函数中,this指向window**

    **2.`attachEvent`添加多个事件时候时,不是按照添加顺序执行,而是按照相反的顺序执行,后添加,先执行**

总结

上一篇 下一篇

猜你喜欢

热点阅读