深入理解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 相关文章推荐
很酷的javascript loading效果代码
Jun 18 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
Apr 20 Javascript
jQuery中:only-child选择器用法实例
Jan 03 Javascript
JavaScript获取表单内所有元素值的方法
Apr 02 Javascript
javascript 闭包详解
Jul 02 Javascript
JS和canvas实现俄罗斯方块
Mar 14 Javascript
js每隔两秒输出数组中的一项(实例)
May 28 Javascript
发布一款npm包帮助理解npm的使用
Jan 03 Javascript
生产制造追溯系统之在线打印功能
Jun 03 Javascript
layer设置maxWidth及maxHeight解决方案
Jul 26 Javascript
小程序调用微信支付的方法
Sep 26 Javascript
浅谈JavaScript浅拷贝和深拷贝
Nov 07 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实现获取及设置用户访问页面语言类
2014/09/24 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
PHP进程通信基础之信号
2017/02/19 PHP
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
JavaScript 函数式编程的原理
2009/10/16 Javascript
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
Javascript继承机制详解
2017/05/30 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
python3学习之Splash的安装与实例教程
2018/07/09 Python
详解python数据结构和算法
2019/04/18 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
Python netmiko模块的使用
2020/02/14 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
后勤工作职责
2013/12/22 职场文书
八年级历史教学反思
2014/01/10 职场文书
小学数学教研活动总结
2014/07/01 职场文书
教师节标语大全
2014/10/07 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书