欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DOM事件流,冒泡 | 捕获 | 委托 ,详解

程序员文章站 2022-03-08 22:55:16
...

(一)DOM事件流

① 定义

DOM事件流包括三个阶段

  1. 捕获阶段
  2. 目标阶段
  3. 冒泡阶段

事件发生时会在元素节点之间按照特定的顺序传播,这个传播的过程就是DOM事件流
简单的说:事件的传播过程即DOM事件流

② 图解

DOM事件流,冒泡 | 捕获 | 委托 ,详解
DOM事件流,冒泡 | 捕获 | 委托 ,详解

③ 历史

当浏览器发展到第四代时(IE4及Netscape Communicator4),浏览器开发团队遇到了一个很有意思的问题:页面的哪一部分会拥有某个特定的事件?要明白这个问题问的是什么,可以想象画在一张纸上的一组同心圆。如果你把手指放在圆心上,那么你的手指指向的不是一个圆,而是纸上所有的圆,两家公司的浏览器开发团队在看待浏览器事件方面还是一致的。如果你单击了某个按钮,他们都认为单击事件不仅仅发生在按钮上。换句话说,在单机按钮的同时,你也单击了按钮的容器元素,甚至也单击了整个页面。
事件流描述的是从页面中接受事件的顺序。但有意思的是,IE 和 Netscape 开发团队居然提出了差不多完全相反的概念,IE的事件流是冒泡流,而Netscape Communicator的事件流是事件捕获流。
(摘自《JavaScript高级程序设计》)

下面我用实例展现一下冒泡流和捕获流的不同之处。

(二)冒泡

DOM事件流,冒泡 | 捕获 | 委托 ,详解
我给分别给div、section、body、html、window设置了点击事件,然后只点击了div

事件的执行顺序是:
小 → 大
div → section → body → html → window

下面贴上代码(css部分就不贴了,问题不大)

html部分

<body>
    <p>body</p>
    <section>
       <p>父盒子</p> 
        <div>子盒子</div>
    </section>
</body>

JS部分

    <script>
        var oSection = document.querySelector("section");
        var oDiv = document.querySelector("div");
        var oHtml = document.documentElement;
        var oBody = document.body;
        oDiv.addEventListener("click",function(){
            alert("我是子盒子")
        })
        oSection.addEventListener("click",function(){
            alert("我是父盒子")
        })
        oHtml.addEventListener("click",function(){
            alert("我是html")
        })
        oBody.addEventListener("click",function(){
            alert("我是body")
        })
        window.addEventListener("click",function(){
            alert("我是window")
        })
    </script>

(三)捕获

事件捕获如何触发呢?
这时需要用到 addEventListener( )方法的第三个参数(默认为false,即冒泡阶段),将第三个参数改为true,表示将此事件改为捕获阶段。
( 如果不了解addEventListener( )方法的可以 查看文档

接下来我们看一下事件在捕获阶段的触发顺序:

根据上面的代码,我们先把父盒子section的点击事件变为捕获阶段

    oSection.addEventListener("click",function(){
        alert("我是父盒子")
    },true)

看看效果:
DOM事件流,冒泡 | 捕获 | 委托 ,详解
此时的执行顺序是:

section → div → body → html → window

因为此时父盒子section的点击事件在捕获阶段,所以先执行,然后其它的在冒泡阶段的事件开始往上冒泡。

现在,我们将所有的事件都变成捕获阶段,看看效果:DOM事件流,冒泡 | 捕获 | 委托 ,详解
此时的执行顺序是:

window → html → body → section → div

与冒泡阶段的执行顺序完全相反。

总结

DOM事件流,冒泡,捕获并不难理解

往池塘里扔一块石头,石头击破水面慢慢沉入水底,由于水的压力把空隙里面的空气挤出,就会产生气泡往上冒。

石头从水面沉入水底比作捕获,气泡往上冒比作冒泡,再结合文章开头的图解,就好理解多了。


结语:若文章有错误的地方,烦请在评论区指出。当然,我会不定时的重新编辑写过的文章,查错及优化,希望能将最好的文章展现给读者。

相关标签: dom javascript