深入理解JS DOM事件机制


Posted in Javascript onAugust 06, 2016

1、事件流

html 元素触发事件的顺序。

2、事件冒泡IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。3、事件捕获事件捕获的思想是不太具体的节点应该更早的接收到事件,而最具体的节点应该在最后接收到节点。事件捕获的用意在于事件到达预定目标之前捕获它。

DOM事件流
“DOM2级事件流”规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段和冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件。最后一个阶段是冒泡阶段,可以在这个阶段对事件作出响应。以简单的HTML页面为例,单击<div>元素会按照下图顺序触发事件。

深入理解JS DOM事件机制

在DOM事件流中,实际的目标(<div>元素)在捕获阶段不会接收到事件。这意味着在捕获阶段,事件从document到<html>再到<body>后就停止了。下一个阶段是“处于目标”阶段,于是事件在<div>上发生,并在事件处理中被看成冒泡阶段的一部分。然后冒泡阶段发生,事件又传播回文档。
多数支持DOM事件流的浏览器都实现了一种特定行为;即使“DOM2级事件”规范明确要求捕获阶段不会涉及事件的目标,但Safari、Chrome、Firefox和Opera9.5及更高版本都会在捕获阶段触发事件对象上的事件。结果,就是有两个机会在目标对象上面操作事件。

阻止事件冒泡

实验

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title></title>
	<script type="text/javascript">
		function onBtn() {
			alert('button');
			//cancelBubble(); 阻止事件冒泡
		}
		//获取事件对象
		function getEvent(){
			//如果为ie或chrome
			if(window.event){return window.event;}

			//针对firefox
			func = getEvent.caller; //获取函数调用者
			while(func != null){
				var arg0 = func.arguments[0]; //获取调用者第一个参数
				//判断参数是否为空
				if(arg0){
					//判断arg0是否为事件对象
				  if((arg0.constructor == Event || arg0.constructor == MouseEvent
				    || arg0.constructor == KeyboardEvent)
				    ||(typeof(arg0) == "object" && arg0.preventDefault
				    && arg0.stopPropagation)){
				     return arg0;
				   }
				}
				//获取func调用者
				func = func.caller;
			}
			return null;
		}
		//阻止事件冒泡
		function cancelBubble() {
			event = getEvent();
			 // Firefox chrome
		  if(event.preventDefault) {  
		   
		    event.preventDefault();  
		    event.stopPropagation(); 

		   } else { 
		   	//ie 
		    event.cancelBubble=true;  
		    event.returnValue = false;
		   }  
		}
	</script>
</head>
<body onclick="alert('body')">
	<div onclick="alert('div');" style="background-color:green">
		<button onclick="onBtn()">dsd</button>
	</div>
</body>
</html>

上面的html代码执行的事件触发顺序。

默认情况: 依次会弹出 'button' ---》 弹出'div' -----》弹出'body'

如果加上cancelBubble()代码:只会弹出'button'

以上这篇深入理解JS DOM事件机制就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
asp 的 分词实现代码
May 24 Javascript
用jQuery获取IE9下拉框默认值问题探讨
Jul 22 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
Oct 18 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
Nov 14 Javascript
用javascript读取xml文件读取节点数据
Aug 12 Javascript
JS阻止事件冒泡行为和闭包的方法
Jun 16 Javascript
微信小程序 wx.request(object) API详解及实例代码
Sep 30 Javascript
js图片延迟加载(Lazyload)三种实现方式
Mar 01 Javascript
原生JS写Ajax的请求函数功能
Dec 22 Javascript
JS栈stack类的实现与使用方法示例
Jan 31 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
Jun 25 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
Aug 06 #Javascript
用JS写的一个Ajax库(实例代码)
Aug 06 #Javascript
angularJS 如何读写缓冲的方法(推荐)
Aug 06 #Javascript
JS获取和修改元素样式的实例代码
Aug 06 #Javascript
原生js获取元素样式的简单方法
Aug 06 #Javascript
浅析Node.js实现HTTP文件下载
Aug 05 #Javascript
JS中对Cookie的操作详解
Aug 05 #Javascript
You might like
PHP中如何判断AJAX提交的数据
2012/02/05 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
2019/03/19 jQuery
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
Python显示进度条的方法
2014/09/20 Python
python有证书的加密解密实现方法
2014/11/19 Python
部署Python的框架下的web app的详细教程
2015/04/30 Python
Python编程之属性和方法实例详解
2015/05/19 Python
python字符串的方法与操作大全
2018/01/30 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
使用Python进行中文繁简转换的实现代码
2019/10/18 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
工作会议欢迎词
2014/01/16 职场文书
学生手册评语
2014/05/05 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
2015暑假假期总结
2015/07/13 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js