深入理解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 中对象的继承〔转贴〕
Jan 22 Javascript
小议javascript 设计模式 推荐
Oct 28 Javascript
js操作时间(年-月-日 时-分-秒 星期几)
Jun 20 Javascript
Js注册协议倒计时的小例子
Jun 24 Javascript
js如何调用qq互联api实现第三方登录
Mar 28 Javascript
BootStrap Select清除选中的状态恢复默认状态
Jun 20 Javascript
微信小程序实现自上而下字幕滚动
Jul 14 Javascript
浅谈Vue.use的使用
Aug 29 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
Dec 02 Javascript
深入分析JavaScript 事件循环(Event Loop)
Jun 19 Javascript
Vue+Flask实现图片传输功能
Apr 01 Vue.js
vue实现在data里引入相对路径
Jun 05 Vue.js
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面向对象编程快速入门
2006/10/09 PHP
比较时间段一与时间段二是否有交集的php函数
2011/05/31 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
2013/06/06 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
利用Angular.js编写公共提示模块的方法教程
2017/05/28 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
Python中的多行注释文档编写风格汇总
2016/06/16 Python
Python开发的实用计算器完整实例
2017/05/10 Python
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
python破解zip加密文件的方法
2018/05/31 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
Python中的With语句的使用及原理
2020/07/29 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
高中打架检讨书
2014/02/13 职场文书
计算机网络专业求职信
2014/06/05 职场文书
基层党建工作汇报材料
2014/08/15 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
党员反邪教心得体会
2016/01/15 职场文书
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python
vue 给数组添加新对象并赋值
2022/04/20 Vue.js