深入理解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版代码高亮
Jun 26 Javascript
jQuery创建插件的代码分析
Apr 14 Javascript
jQuery UI Autocomplete 体验分享
Feb 14 Javascript
js禁止页面使用右键(简单示例代码)
Nov 13 Javascript
jQuery窗口、文档、网页各种高度的精确理解
Jul 02 Javascript
JavaScript的设计模式经典之代理模式
Feb 24 Javascript
JavaScript简介_动力节点Java学院整理
Jun 26 Javascript
angularjs数组判断是否含有某个元素的实例
Feb 27 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
Feb 06 Javascript
详解webpack的clean-webpack-plugin插件报错
Oct 16 Javascript
vue项目实现减少app.js和vender.js的体积操作
Nov 12 Javascript
如何开发一个渐进式Web应用程序PWA
May 10 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+MSSQL分页的例子
2006/10/09 PHP
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
php 魔术方法详解
2014/11/11 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
显示js对象所有属性和方法的函数
2009/10/16 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
python实现rest请求api示例
2014/04/22 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
django站点管理详解
2017/12/12 Python
python实现字符串和字典的转换
2018/09/29 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
python实现dijkstra最短路由算法
2019/01/17 Python
Python文本处理简单易懂方法解析
2019/12/19 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
报关专员求职信范文
2014/02/22 职场文书
成绩单家长评语大全
2014/04/16 职场文书
低碳环保标语
2014/06/12 职场文书
庆祝国庆节演讲稿2014
2014/09/19 职场文书
酒店前台接待岗位职责
2015/04/02 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
归途列车观后感
2015/06/17 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
深度好文:50条没人告诉你的人生经验,句句精辟
2019/08/22 职场文书
Golang jwt身份认证
2022/04/20 Golang
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技