一丶 流

什么是流?

比如 react 中的单项数据流,Node.js 中的流,或者本文中的 DOM 事件流,都是流的具体体现。专业地讲,流是程序输入或输出的一个连续的字节序列;通俗地讲,流是有方向的数据。

二丶 事件流

什么是事件流?

假想一下,现在有一组同心圆,你把手指在最里面的圆心上,与此同时,你也正在指着外层的其他同心圆。假设最里面的圆是 DOM 中的一个按钮,那就是说,你点击按钮这个元素的同时,也点击了他的所有父级元素。那么这个点击事件 DOM 要怎么处理呢?事实上,这个点击事件并非只是简单地在被点击的元素上发生一次。那么点击事件是谁先得到通知并响应呢?

事件捕获

事件捕获就是指被点击元素的父级元素应该先接收到事件,并向下传播,就像例子中的按钮点击事件,接收到事件的元素顺序应该为 window > document > body > button.

事件冒泡

事件冒泡跟事件捕获好顺序相反,认为应该是被点击的具体元素先接受到事件:button > body > document > window.

事件阶段

当一个 DOM 事件发生时,要经历三个阶段:

1. 从文档的根节点流向目标对象 ---> 捕获阶段;

2. 在目标对象上被触发 ---> 目标阶段;

3. 回溯到文档的根节点 ---> 冒泡阶段。

三丶 卵用

通过事件监听(addEventListener(type,callback,true))在父级元素捕获事件,可以阻止事件冒泡(stopPropagation())引起的问题。

四丶总结

事件流描述的就是事件发生的顺序。

事件捕获:所谓捕获,就像是进行一场狩猎一样,以猎人(不是猎头)的角度来看,已经将猎物(发生事件的元素)活动范围(window)确定了,在外面层层包围,然后缩小包围圈,一层一层由外向内的,直至擒获猎物,即传播到事件发生的具体元素。

目标阶段:以猎物本身的角度讲,比如是一头狮子(不是攻城狮),刚开始只是被猎人们包围,但猎人并不确定自己的具体位置,直到猎人的包围圈足够小,才发现自己。这时候自己就真正成为了他们的目标。

冒泡阶段:还是以狮子角度讲,以狮子的性格,即使是困兽犹斗,也不会坐以待毙的,所以它选择突围(冒泡)。然而外面的猎人(父级元素)有很多,它要一层层地突破,直至逃离了狩猎场(window),才有资格嘲笑愚蠢的人类 0.0 。

阻止事件冒泡:然而对狮子而言,结局并不总是那么美好的,因为自嘲愚蠢的家伙 一般都很精明~ 在以上每个阶段进行的过程中,狮子都可能挂掉,假如这是一群装备精良的盗猎者,他们采用了一些空中侦察技术,并在缩小包围圈(事件捕获阶段)的过程中发现了狮子的踪迹,并用激光制导扯弹麻醉了狮子,那么他们大可以提前打卡下班看小学生打第四节比赛了。这样也就不会出现狮子突围的(冒泡阶段)经典剧情了。也就避免了狮子突围可能造成的伤亡~

就写这么多吧,没有

漫谈DOM 事件流的三个阶段的更多相关文章

  1. 理解DOM事件流的三个阶段

    本文主要解决两个问题: 1.什么是事件流 2.DOM事件流的三个阶段 事件流之事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张 ...

  2. DOM事件流的三个阶段

    事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流. DOM事件流分为三个阶段,分别为: 捕获阶段:事件从Document节点自上而下向目标节点传播的阶段: 目标阶段:真正的目标 ...

  3. 关于DOM事件流、DOM0级事件与DOM2级事件

    一.DOM 事件模型 DOM 事件模型包括捕获和冒泡,捕获是从上往下到达目标元素,冒泡是从当前元素,也就是目标元素往上到 window 二.流 流的概念,在现今的 JavaScript 中随处可见.比 ...

  4. js事件捕获,事件冒泡,事件委托以及DOM事件流

    一:DOM事件流: 事件流是从页面接收事件的顺序,DOM2级事件规定事件流包括三个阶段: ①事件捕获阶段:用意在于事件达到目标之前捕获它,在事件捕获阶段事件流模型:document→html→body ...

  5. DOM事件: DOM事件级别、DOM事件流、DOM事件模型、DOM事件捕获过程、自定义事件

    前端面试中只要问到事件,就肯定会有DOM事件:如果回答出来了,就会一直向下延申,其实这些东西都很简单,但我第一次被问到的时候,也是懵的: DOM事件级别: DOM0 element.onclick = ...

  6. Js-事件分发与DOM事件流

    原文地址:https://www.jianshu.com/p/dc1520327022 Js事件分发与DOM事件流 对JavaScript分发事件不熟悉,网上查阅相关资料整理后,记录一下对Javasc ...

  7. [已转移]JavaScript事件---DOM事件流

    该文章已转移到博客:https://cynthia0329.github.io/ 事件发生时会在元素节点与根节点之间按照特定的顺序传播,路径所经过的所有节点都会收到该事件 这个传播过程即DOM事件流. ...

  8. [DOM Event Learning] Section 4 事件分发和DOM事件流

    [DOM Event Learning] Section 4 事件分发和DOM事件流 事件分发机制: event dispatch mechanism. 事件流(event flow)描述了事件对象在 ...

  9. 从click事件理解DOM事件流

    事件流是用来解释页面上的不同元素接受一个事件的顺序,首先要明确两点: 1.一个事件的影响元素可能不止一个(同心圆理论),但目标元素只有一个. 2.如果这些元素都绑定了相同名称的事件函数,我们怎么知道这 ...

随机推荐

  1. socket udp广播和多播的简单实现

    UDP广播与多播 作者:legend QQ:1327706646 使用UDP协议进行信息的传输之前不需要建议连接.换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信 ...

  2. VC++ GetSafeHwnd用法

    GetSafeHwnd HWND GetSafeHwnd() const; 当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数. ...

  3. 各种API中文文档下载地址

    转发: http://www.aseoe.com/api-download/download.html jquery easyui 帮助文档: http://download.csdn.net/dow ...

  4. LeetCode 125 Valid Palindrome(有效回文)(*)

    翻译 给定一个字符串.确定它是否是回文的,仅仅考虑当中的数字和字符并忽略其它. 比如. "A man, a plan, a canal: Panama" 是回文的. "r ...

  5. TreeSet排序,存储自己定义对象,自己定义比較器演示样例

    Set:无序.不能够反复元素. |--HashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:推断元素的hashCode值是否同样. 假设同样,还会继续推断元素的equals方法.是 ...

  6. leetcode -- Maximal Rectangle TODO O(N)

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  7. 多线程sshd爆破程序代码

    不多说了,直接上手代码,也没有啥练手的,都是很熟悉的代码,水一篇,方便作为工作的小工具吧.试了一下,配合一个好点的字典,还是可以作为个人小工具使用的. #!/usr/bin/env python # ...

  8. Vue基础-作用域插槽-列表组件

    Vue 测试版本:Vue.js v2.5.13 Vue 官网介绍作用域插槽时, 在 2.5.0+,slot-scope 能被用在任意元素或组件中而不再局限于 <template>. 作用域 ...

  9. 160328、rabbitMQ集群部署示例

    环境:Centos 6.5 x86_64MQ网址:http://www.rabbitmq.com/SERVER101\SERVER102 SERVER103 一.单节点安装 #yum install ...

  10. HTML代码大全

    1.html的简介* 什么是html?- HyperText Markup Language:超文本标记语言,网页语言** 超文本:超出文本的范畴,使用html可以轻松实现这样操作** 标记:html ...