美文网首页
对DOM事件流(捕获,目标,冒泡)的理解

对DOM事件流(捕获,目标,冒泡)的理解

作者: zhjwang | 来源:发表于2018-10-12 21:18 被阅读61次

在项目上遇到一些与事件流相关的问题,研究如下,网上的解释都不清楚,而且都是一个抄一个,所以还是建议去看下这本书《JavaScript高级程序设计第三版》dom的那一章。
https://github.com/shihyu/JavaScript/blob/master/books/JavaScript%E9%AB%98%E7%BA%A7%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%EF%BC%88%E7%AC%AC3%E7%89%88%EF%BC%89%E3%80%91%E4%B8%AD%E6%96%87%20%E9%AB%98%E6%B8%85%20%E5%AE%8C%E6%95%B4%20%E8%AF%A6%E7%BB%86%E4%B9%A6%E7%AD%BE%E7%89%88.pdf

总结下:
首先当我们在页面上触发一个事件的时候,DOM遵循这样的事件流(捕获->目标->冒泡)。
举个例子:

<html lang="zh-cn">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>js事件机制</title>
    <style>
        #parent{
            width: 200px;
            height:200px;
            text-align: center;
            line-height: 3;
            background: green;
        }
        #child{
            width: 100px;
            height: 100px;
            margin: 0 auto;
            background: orange;
        }
    </style>
    </head>
<body>
    <div id="parent">
        父元素
        <p id="child">
            子元素
        </p>
    </div>
    <script type="text/javascript">
        var parent = document.getElementById("parent");
        var child = document.getElementById("child");
    
        document.addEventListener("click",function(e){
            const element = event.srcElement;
            const elementName = element.localName;
            // console.log(e);
            console.log(elementName);
            console.log("click-body");
        },false);
        
        parent.addEventListener("click",function(e){
            const element = event.srcElement;
            const elementName = element.localName;
            // console.log(e);
            console.log(elementName);
            console.log("click-parent");
        },true);

        child.addEventListener("click",function(e){
            const element = event.srcElement;
            const elementName = element.localName;
            console.log(elementName);
            console.log("click-child");
        },false);
    </script>
</body>
</html>

这个时候去点击子元素,如下:


image.png
  • 解释:首先事件从最外层捕获,document发现click是在冒泡阶段获取,所以先不执行。到parent发现是在捕获阶段,所以在这时就可以先执行了。然后到child位目标元素,开始冒泡。所以document在冒泡阶段执行。

换个例子:

   document.addEventListener("click",function(e){
            const element = event.srcElement;
            const elementName = element.localName;
            // console.log(e);
            console.log(elementName);
            console.log("click-body");
        },true);
        
        parent.addEventListener("click",function(e){
            const element = event.srcElement;
            const elementName = element.localName;
            // console.log(e);
            console.log(elementName);
            console.log("click-parent");
        },false);

        child.addEventListener("click",function(e){
            const element = event.srcElement;
            const elementName = element.localName;
            console.log(elementName);
            console.log("click-child");
        },true);
image.png

这个时候是document先执行,因为正好是true,表示是在捕获阶段执行,但是到parent的时候,发现是在冒泡阶段执行,所以不执行,要等到冒泡阶段才执行。然后开始执行child事件。

function(e)中的e都表示的目标dom

相关文章

  • 事件冒泡、事件捕获、事件委托

    一、DOM事件流 DOM事件流(event flow)存在三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段,事件...

  • JavaScript事件

    事件流 DOM2级事件流 、事件捕获阶段,目标阶段,事件冒泡阶段 DOM0事件 元素的方法,冒泡阶段被处理,同一种...

  • 第13章、事件

    13.1 事件流 “DOM2级事件”规定事件流包括3个阶段:事件捕获阶段,处于目标阶段,事件冒泡阶段。事件捕获表示...

  • DOM 事件流

    这篇笔记主要简述下 DOM 事件流 - DOM Event Flow. 用于理解事件捕获与冒泡. 什么是事件 事件...

  • 对DOM事件流(捕获,目标,冒泡)的理解

    在项目上遇到一些与事件流相关的问题,研究如下,网上的解释都不清楚,而且都是一个抄一个,所以还是建议去看下这本书《J...

  • 前端面试题(3)——DOM事件类

    基本概念:DOM事件的级别 DOM事件模型:事件冒泡事件捕获 DOM事件流 描述DOM事件捕获的具体流程 Even...

  • DOM事件

    DOM事件流(event flow )存在三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。 事件捕获(eve...

  • 实习第七十天(js事件机制)

    DOM事件流(event flow )存在三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。 事件捕获(eve...

  • 3-6 DOM事件

    问题 DOM 事件的级别 DOM 事件模型(就是捕获和冒泡儿) DOM 事件流 描述DOM事件捕获的具体流程 Ev...

  • DOM事件与事件委托

    事件流 DOM 事件流分为三个阶段:捕获阶段、目标阶段、冒泡阶段。先调用捕获阶段的处理函数,其次调用目标阶段的处理...

网友评论

      本文标题:对DOM事件流(捕获,目标,冒泡)的理解

      本文链接:https://www.haomeiwen.com/subject/fjqnaftx.html