深入理解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 相关文章推荐
HTML中不支持静态Expando的元素的问题
Mar 08 Javascript
JavaScript之引用类型介绍
Aug 10 Javascript
通过正则格式化url查询字符串实现代码
Dec 28 Javascript
JQuery中对Select的option项的添加、删除、取值
Aug 25 Javascript
javascript避免数字计算精度误差的方法详解
Mar 05 Javascript
js截取中英文字符串、标点符号无乱码示例解读
Apr 17 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
Aug 14 Javascript
weebox弹出窗口不居中显示的解决方法
Nov 27 Javascript
vue 中 命名视图的用法实例详解
Aug 14 Javascript
基于JS实现简单滑块拼图游戏
Oct 12 Javascript
vue 实现v-for循环回来的数据动态绑定id
Nov 07 Javascript
Js和VUE实现跑马灯效果
May 25 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版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
javascript 全角转换实现代码
2009/07/17 Javascript
js三种排序算法分享
2012/08/16 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
javascript实现的一个带下拉框功能的文本框
2014/05/08 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
koa socket即时通讯的示例代码
2018/09/07 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
python使用代理ip访问网站的实例
2018/05/07 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
Python 项目转化为so文件实例
2019/12/23 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
英国探险旅游专家:Explore
2018/12/20 全球购物
介绍一下Make? 为什么使用make
2016/07/31 面试题
函授本科自我鉴定
2013/11/03 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
歌咏比赛主持词
2015/06/29 职场文书
课改心得体会范文
2016/01/25 职场文书
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL