DOM事件流

1.定义:

DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素节点与根结点之间的路径传播,路径所经过的结点都会收到该事件,这个传播过程可称为DOM事件流。DOM事件流最独特的性质是,文本节点也触发事件(在IE中不会),当鼠标单击“单击此文本”文本时会触发click事件,该事件的捕获阶段最先开始,从Document节点开始逐渐向下传播,直到“单击此文本”文本节点,事件进入目标阶段,在目标阶段结束之后,事件由“单击此文本”文本节点开始事件的冒泡阶段,直到Document节点为止。

2.两种事件流:

冒泡型事件流:事件的传播是从最特定事件目标到最不特定的事件目标。即从DOM树的叶子到根。

捕获型事件流:事件的传播的英文从最不特定事件目标到最特定的事件目标。即从DOM树的根到叶子。

 <模板>
<div id =“div1”style =“width:200px; height:200px;” V-上:click.capture = “迎接( '1',$事件)”>
<div id =“div2”style =“width:150px; height:150px;” V-上:click.capture = “迎接( '2',$事件)”>
<div id =“div3”style =“width:100px; height:100px;” V-上:click.capture = “迎接( '3',$事件)”> 3 </ DIV>
</ DIV>
</ DIV>
</模板> <SCRIPT>
从“vue”导入Vue;
export default {
名字:'你好',
data(){
返回{
名称:'Vue.js'
}
},
方法:{
greet:function(msg,e){
执行console.log(味精)
}
}
}
</ SCRIPT> <! - 添加“scoped”属性以仅将CSS限制为此组件 - >
<style scoped>
DIV {
border:1px#333 solid
}
</样式>

输出:

3.process

事件如何通过DOM树传播。应用程序可以使用该dispatchEvent()方法调度事件对象,并且事件对象将通过DOM事件流确定的DOM树传播。

使用DOM事件流在DOM树中调度的事件的图形表示

事件对象被分派到事件目标。但是在发送开始之前,必须首先确定事件对象的传播路径传播路径是的有序列表的当前事件的目标,通过该事件传递。该传播路径反映了文档的分层树结构。列表中的最后一项是事件目标,列表中的前面项目称为目标的祖先,前面的项目作为目标的父项。一旦确定了传播路径,事件对象就会经过一个或多个事件阶段。有三个事件阶段:捕获阶段目标阶段泡沫阶段。事件对象完成这些阶段,如下所述。如果不支持某个阶段,或者事件对象的传播已停止,则将跳过该阶段。例如,如果bubbles属性设置为false,则将跳过气泡阶段,如果stopPropagation()在分派之前调用,则将跳过所有阶段。

(1)捕获阶段:事件对象通过目标的祖先从传播窗口到目标的父,即事件从目标节点自上而下向Document节点传播的阶段。

(2)目标阶段:本次活动对象到达事件对象的事件的目标。如果事件类型指示事件未冒泡,则事件对象将在此阶段完成后暂停,即事件从目标节点自上而下向Document节点传播的阶段。

(3)冒泡阶段:事件对象通过目标的祖先中传播以相反的顺序,开始与目标的父和与所述结束窗口,即事件从目标节点自上而下向Document节点传播的阶段。

4.method:

语法: 
element.addEventListener(event, function, useCapture)

参数 描述
event 必需。描述事件名称的字符串。

注意: 不要使用 "on" 前缀。例如,使用 "click" 来取代 "onclick"。

提示: 所有 HTML DOM 事件,可以查看我们完整的 HTML DOM Event 对象参考手册

function 必需。描述了事件触发后执行的函数。

当事件触发时,事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, "click" 事件属于 MouseEvent(鼠标事件) 对象。

useCapture 可选。布尔值,指定事件是否 在捕获或冒泡阶段执行。

可能值:

  • true - 事件句柄在捕获阶段执行
  • false- 默认。事件句柄在冒泡阶段执行

5.applicants:

 <!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>DOM事件流</title>
</head>
<body>
<div id="div1">
<button id="btn">按钮</button>
</div>
<script>
var btn = document.getElementById("btn");
var div1 = document.getElementById("div1"); //事件目标
btn.onclick = function(){
console.debug("目标1.Click btn");
}
btn.addEventListener("click",function(){
console.debug("目标2.Click btn");
},true); //事件冒泡
div1.onclick = function(){
console.debug("冒泡1.Click div1");
}
document.body.onclick = function(){
console.debug("冒泡2.Click Body");
}
document.onclick = function(){
console.debug("冒泡3.Click document");
}
window.onclick = function(){
console.debug("冒泡4.Click window");
} //事件捕获
window.addEventListener("click",function(){
console.debug("捕获4.Click window");
},true);
document.addEventListener("click",function(){
console.debug("捕获3.Click document");
},true);
document.body.addEventListener("click",function(){
console.debug("捕获2.Click body");
},true);
div1.addEventListener("click",function(){
console.debug("捕获1.Click div1");
},true); </script>
</body>
</html>
 document.body.addEventListener("click",function(){
console.debug("捕获2.Click body");
},true);

addEventListener用于注册事件的处理器,当添加了第三个参数为true时,代表了在捕捉阶段接受后代元素的事件。

点击button按钮后,结果如下

 event.html:38 捕获4.Click window
event.html:41 捕获3.Click document
event.html:44 捕获2.Click body
event.html:47 捕获1.Click div1
event.html:16 目标1.Click btn
event.html:19 目标2.Click btn
event.html:24 冒泡1.Click div1
event.html:27 冒泡2.Click Body
event.html:30 冒泡3.Click document
event.html:33 冒泡4.Click window

由此可见DOM事件流的顺序是
1.捕获
window
document
body
div1

2.目标 (目标的顺序与事件定义的先后顺序有关)
目标一
目标二

3.冒泡
div1
body
document
window

应用场景
以上面的例子为例,想要触发在button上的事件,但是不想触发在div和其上元素的事件时,弄清事件流就相当重要。比如:阻止事件冒泡过程,防止事件冒泡而带来不必要的错误和困扰。 这个方法就是:stopPropagation() 对button的click事件做一些改造。

 

JS之event flow的更多相关文章

  1. event flow

    JS之event flow DOM事件流 1.定义: DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素节点与根结点之间的路径传播,路径所经过的结点都会收到该事 ...

  2. Javascript——浅谈 Event Flow

    1.Javascript Events : Event Bubbling(事件冒泡) 如果事件从最特定的元素开始,则事件流中的一个阶段称为事件冒泡(DOM中可能最深的节点)然后向上流向最不特定的节点( ...

  3. 关于 javascript event flow 的一个bug

    [1]描述了firefox,safari 有一个bug和DOM 3 规范不一致:在event.currentTarget等于event.target的时候(即event flow处于target ph ...

  4. JS中event.keyCode用法及keyCode对…

    js中event.keyCode用法及keyCode对照表 标签: javascriptJavaScriptJavascriptjavaScript 2012-12-11 15:11 HTML Jav ...

  5. 浅析Node.js的Event Loop

    目录 浅析Node.js的Event Loop 引出问题 Node.js的基本架构 Libuv Event Loop Event Loop Phases Overview Poll Phase The ...

  6. 定时器setTimeout()和Node.js的Event Loop

    一.定时器 setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行.它在"任务队列"的尾部添加一个事件,因此要等到同步任务和 ...

  7. javaScript高级教程(五) Event Flow

    1.两个阶段三个模型:Netscape支持事件捕获,IE支持事件冒泡,w3c是先捕获后冒泡 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 S ...

  8. js & input event & input change event

    js & input event & input change event vue & search & input change <input @click=& ...

  9. js中event的target和currentTarget

    js 中的event是个很有用的对象,不同的浏览器,处理方式可能不一样. 我们现在只考虑标准的浏览器的情况 event是表示时间触发的产生的对象,以click事件为例. 由于冒泡的存在,event对象 ...

随机推荐

  1. c#XML转换成实体

    首选:我的XML文件如下(mysql表里导出的):几千条,就选2条做例子. <?xml version="1.0" encoding="utf-8" ?& ...

  2. Vue+element 实现文件导出xlsx格式

    傻瓜教程:   第一步:安装两个依赖包 npm install --save xlsx file-saver 第二步:建立一个Vue文件,导入以下代码即可 <template> <d ...

  3. nginx----------linux下nginx环境搭建遇到的一些问题汇总(多域名配置,配置文件修改问题)

    一.启动 cd usr/local/nginx/sbin ./nginx 二.重启 更改配置重启nginx kill -HUP 主进程号或进程号文件路径 或者使用 cd /usr/local/ngin ...

  4. Oracle 24角色管理

    了解什么是角色 Oracle角色(role)就是一组权限(或者说是权限的集合). 用户可以给角色赋予指定的权限,然后将角色赋给相应的用户. 三种标准的角色 connect(连接角色) 拥有connec ...

  5. Jmeter登录后Session自动共享与多线程组并行

    在接口测试中,出于安全考虑接口是需要session才能访问.另外在此基础上,我们还可能模拟不同的客户端登录,需要并行运行移动端线程组. 实现session共享1)修改jmeter安装目录bin下的jm ...

  6. Python 语言来编码和解码 JSON 对象

    Json函数: json.dumps: Python标准库中的json模块,集成了将数据序列化处理的功能. 将 Python 对象编码成 JSON 字符串 语法: json.dumps(obj, sk ...

  7. 复习-css边框和背景属性

    css边框和背景属性 border:所有边框属性 border-width:四条边框的宽度 border-style:设置边框样式,主要有dotted.solid.double border-colo ...

  8. 利用“Java同包同名类执行顺序”取消Java 网站应用程序Licence验证

    如果是在tomcat里运行,lib目录下一大堆的JAR包,不同的JAR包里可能会有相同的包名类名,JRE按照JAR名字的字母顺序加载JAR文件,同名类如果已加载,则后面的同名类会忽略. 公司购买的一款 ...

  9. jvm 线上命令

    jstat -gc 40015 查看jvm用的是什么gc算法 java -XX:+PrintCommandLineFlags -version

  10. 关于mysql触发器和存储过程的理解

    内容源自:一篇很棒的 MySQL 触发器学习教程 一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊 ...