在Javascript的DOM中,关于事件Event对象的知识是一定要掌握的。Event对象模型主要分为两个部分,一个是Event对象本身具有的属性和方法,这个参照API就可以学得;另一个是在DOM节点上绑定的事件,例如click,dblclick,mouseenter等,以及事件在DOM节点中的传播。今天我们主要就javascript中事件流的传播过程以及不同DOM级事件处理程序进行讲解。

事件流

事件流可以理解为事件在页面的DOM节点之间传播的顺序,主要分为三个过程,分别是:事件捕获阶段 --> 事件目标阶段 --> 事件冒泡阶段,从下图可以看出事件的传播过程

DOM的事件流

  • 事件捕获

事件捕获的思想是页面上最外层的节点先接收事件,然后向内层元素逐级传播。例如上面的例子中,事件捕获阶段的传播顺序为:window --> document --> html --> body --> table --> tbody --> tr --> td

  • 事件冒泡

事件冒泡和事件捕获刚好相反,它的思想是让最内层节点先接收事件,然后向外层逐级传播。上面的例子中,事件冒泡阶段传播顺序为:td --> tr --> tbody --> table --> body --> html --> document --> window

  • 事件目标阶段

不管在事件传播阶段还是在事件冒泡阶段,都必然经历事件目标阶段,表示对DOM节点的事件进行处理

事件处理程序

事件处理程序实际上就是绑定在DOM节点上的事件函数。在W3C标准中,分为DOM0,DOM2和DOM3,而在DOM1中没有定义事件相关内容,因此没有DOM1级事件模型。

DOM0级事件模型

通过将函数直接赋值给事件处理属性,在DOM0中只支持事件冒泡的过程

DOM0事件处理程序

DOM2级事件处理程序

在DOM2中,事件处理过程会通过不同的参数配置来决定是采用事件捕获还是事件冒泡,还是两个过程都执行。由于浏览器的不同,DOM2中事件绑定方法也不一样

  • IE浏览器

在IE10及以下版本的浏览器中,只支持事件冒泡,而在IE11中又添加了对事件捕获的支持。在IE10及以下版本中,通过下列方法添加或删除事件

IE10以下事件处理程序

  • 非IE浏览器

非IE的事件处理程序

通过useCapture参数来确定采用哪种方式,true表示事件捕获,false表示事件冒泡,默认状态为false。

IE和非IE浏览器的比较

  • 相同点

(1)支持同一个元素上绑定多个事件处理函数

多个事件处理函数

(2)不能删除匿名函数,删除时必须和绑定的函数一致

不能删除匿名函数

  • 不同点

(1)在使用attachEvent方法为同一个事件添加多个函数时,执行顺序与绑定的顺序相反

attachEvent绑定事件

(2)attachEvent执行的作用域指向全局环境,因此this指向window;而addEventListener执行的作用域在DOM元素内部,因此this指向绑定的元素

  • 兼容性处理

兼容性处理

DOM3级事件处理程序

DOM3在保留了DOM2特性的基础上,添加了一些新方法。最大的改进就是DOM3允许自定义事件,通过createEvent()方法完成,返回的方法通过initCustomEvent()方法来初始化。

DOM3自定义事件

上述例子表示,创建一个冒泡事件'myEvent',然后绑定在div和document上,因为采用事件冒泡,因此会先alert出‘div myEvent’,再输出‘document myEvent’。

总结

以上是一些关于Event的事件流和不同DOM级事件处理程序知识的介绍,希望对大家有用。

JS事件流与DOM事件处理程序的更多相关文章

  1. JS事件流、DOM事件流、IE事件处理、跨浏览器事件处理、事件对象与类型

    事件的移除 removeEventListener() 第二个参数需要指定要移除的事件句柄,不能是匿名函数,因为无法识别 想要移除成功,那么三个参数必须跟addEventListener中的三个完全一 ...

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

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

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

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

  4. IE和DOM事件流、普通事件和绑定事件的区别

    IE和DOM事件流的区别 IE采用冒泡型事件 Netscape(网络信息浏览器)使用捕获型事件 DOM使用先捕获后冒泡型事件 示例: <body> <div> <butt ...

  5. [已转移]IE事件流和DOM标准事件流的区别

    该文章已转移到博客:https://cynthia0329.github.io/ 1.执行的顺序不一样 冒泡型事件模型: button->div->body (IE事件流) 捕获型事件模型 ...

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

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

  7. JavaScript DOM高级程序设计 4.3控制事件流和注册事件侦听器--我要坚持到底!

    一.事件流 我们通过下面一个实例,进行说明. <body> <h1>Event Flow</h1> <ul id="nav"> &l ...

  8. Js事件分发与DOM事件流

    这一篇比较透彻:https://www.jianshu.com/p/dc1520327022 点击了目标节点后,捕获阶段里事件会从外向目标传递:到了目标阶段,捕获和冒泡的执行顺序按照事件被定义的先后顺 ...

  9. js和jquery的DOM事件大全

随机推荐

  1. POJ 1236 学校网络间的强连通

    题目大意: N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输.问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件.问题2:至少需要添加几条 ...

  2. java Web项目Service层通用接口和entityVo对象与entity对象转化问题的解决方案

    Service层的接口中有一些比较常用方法,一次又一次的在新的Service层中被书写,所以懒惰的程序员又烦了,他们决定写个通用接口来解决这个问题. 有些项目中,实体类即承担接收表单数据的任务,又承担 ...

  3. Python的另一种开发环境--Anaconda中的Spyder

    本文作者LucyGill,转载请注明出处(虽然我觉得并不会有人转载). 刚开始学Python的时候,我用的是其自带的idle(安装Python后,在开始菜单里可以找到),后来发现在eclipse中设置 ...

  4. 通过复制现有的redhat虚拟机的文件,实现在VMWare8.0上重建一个新的redhat虚拟机环境

    1.将需要复制的redhat虚拟机的文件都存放在一个新的文件夹redhat下,因为虚拟机很大,所以复制可能花费较长的时间. 2.复制完成后,打开VMWare,选择“Open a Virtual Mac ...

  5. 解决ssh无操作自动断开[转载,已经验证]

    用SSH远程,如果几分钟没有任何操作,连接就会断开,必须重新登陆才行,非常麻烦,一般修改2个地方3项即可解决问题: 1.终端键入:echo $TMOUT       如果显示空白,表示没有设置,等于使 ...

  6. 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版)

    TableGo v6.0.0 版震撼发布,此次版本更新如下: 1.UI界面大改版,组件大调整,提升界面功能的可扩展性. 2.新增BeautyEye主题,界面更加清新美观,也可以通过配置切换到原生Jav ...

  7. jquery 关于ajax 及其son

    <%@ page language="java" pageEncoding="UTF-8"%><%@include file="/c ...

  8. Semaphore使用

    Semaphore使用

  9. hdu5399Too Simple

    //给m个函数 //其相应是自变量x属于{1,2,...n} //f(x)属于{1,2...3} //给出当中一些函数,问有多少种不同的函数集合使得 //1<=i<=n f1(f2(f3. ...

  10. phpexcel不能输出中文

    问题描写叙述:在使用phpexcel时,假设在单元格中填充中文内容,会导致输出单元格为空的情况,甚至连中文的字符(?!等)都无法识别. 产生原因:从网上查是utf-8的问题 解决方法:能够用iconv ...