当前位置: 首页 > news >正文

DOM事件流

DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素结点与根结点之间的路径传播,路径所经过的结点都会收到该事件,这个传播过程可称为DOM事件流。

DOM同时支持两种事件模型:捕获型事件和冒泡型事件,但是,捕获型事件先发生。两种事件流会触发DOM中的所有对象,从document对象开始,也在document对象结束。

DOM事件模型的最独特的性质是,文本节点也触发事件(在IE中不会)

1、冒泡事件流

当事件在某一DOM元素被触发时,例如用户在客户名字节点上点击鼠标,事件将跟随着该节点继承自的各个父节点冒泡穿过整个的DOM节点层次,直到它遇到依附有该事件类型处理器的节点,此时,该事件是onclick事件。在冒泡过程中的任何时候都可以终止事件的冒泡,在遵从W3C标准的浏览器里可以通过调用事件对象上的stopPropagation()方法,在Internet Explorer里可以通过设置事件对象的cancelBubble属性为true。如果不停止事件的传播,事件将一直通过DOM冒泡直至到达文档根。

如果想创建一个捕捉事件,在支持W3C 事件模型的浏览器中,将addEventListener的第三个参数设为true就好了。例如:

前一阵因为想弄懂事件捕捉,所以做了点小实验,分别在Firefox 2、Safari 3 on Windows和Opera 9上实践了事件捕捉(当然,因为IE不支持事件捕捉,所以…),实验的原理见下图:

ID为div1和div2的两个元素都被委派了捕捉阶段的事件处理函数,这样:

当点击#div1(蓝色区域)时,应该会alert出"div1″

当点击#div2(黄色区域)时,应该会先alert出"div1″,再alert出"div2″,因为在事件捕捉阶段,事件是从根元素向下传播的,#div1是#div2的父元素,自然绑定在#div1上的click事件也会先于#div2上的click事件被执行

然而,以上的设想只试用于Firefox 2和Safari 3 on Windows,在Opera 9中,事情会变成这样:

当点击#div1(蓝色区域)时,什么都不会发生

当点击#div2(黄色区域)时,会alert出"div1″,随后什么都不会再发生

2、捕获事件流

事件的处理将从DOM层次的根开始,而不是从触发事件的目标元素开始,事件被从目标元素的所有祖先元素依次往下传递。在这个过程中,事件会被从文档根到事件目标元素之间各个继承派生的元素所捕获,如果事件监听器在被注册时设置了useCapture属性为true,那么它们可以被分派给这期间的任何元素以对事件做出处理;否则,事件会被接着传递给派生元素路径上的下一元素,直至目标元素。事件到达目标元素后,它会接着通过DOM节点再进行冒泡。摘自:360百科

转载于:https://www.cnblogs.com/snowdeer/p/9944193.html

相关文章:

  • 绝对路径 相对路径 相对虚拟目录路径
  • Oracle Long类型转换为Clob类型
  • 三维模型逐渐透明化
  • [转]奇文-闲话操作系统(1/4)
  • 如何得到需要下载文件的链接(路径)?
  • 同网段存活IP公钥分发脚本
  • javascript小技巧
  • vue
  • go关键字之struct定义声明方式
  • linux环境变量配置
  • Embed Youtube or Not
  • 用postman模拟ajax发送json数据的笔记
  • 心情随感
  • NABCD分析
  • 一步一步SharePoint 2007之二:配置SharePoint
  • python3.6+scrapy+mysql 爬虫实战
  • Android Studio:GIT提交项目到远程仓库
  • PAT A1017 优先队列
  • Python连接Oracle
  • Redis的resp协议
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spring-boot 启动时碰到的错误
  • Swoft 源码剖析 - 代码自动更新机制
  • 关于Flux,Vuex,Redux的思考
  • 聊聊directory traversal attack
  • 实现菜单下拉伸展折叠效果demo
  • 移动端解决方案学习记录
  • 由插件封装引出的一丢丢思考
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 第二十章:异步和文件I/O.(二十三)
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (二)PySpark3:SparkSQL编程
  • (转)树状数组
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .chm格式文件如何阅读
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .Net MVC + EF搭建学生管理系统
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 设计模式初探
  • .NET 使用配置文件
  • .net 验证控件和javaScript的冲突问题
  • .netcore 获取appsettings
  • .NET使用存储过程实现对数据库的增删改查
  • .NET是什么
  • .pyc文件是什么?
  • @ConfigurationProperties注解对数据的自动封装
  • @NestedConfigurationProperty 注解用法
  • @property @synthesize @dynamic 及相关属性作用探究
  • @property python知乎_Python3基础之:property
  • [AAuto]给百宝箱增加娱乐功能