博客列表 >js事件冒泡和事件捕捉

js事件冒泡和事件捕捉

有什么是忘不了的的博客
有什么是忘不了的的博客原创
2019年10月22日 11:37:45862浏览

js事件冒泡

当你给一个节点添加一个事件时,在这个事件被触发时该事件会沿着父节点向上传播只到传播到根节点时停止。在这个过程中所有传播到的节点上有这个事件时(第一个节点触发的事件)都会被触发,这就是事件传播。

冒泡事件是默认的处理方式。

实例

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="myDiv">Click me</div>
</body>
<script type="text/javascript">
		var myDiv = document.getElementById('myDiv');
		myDiv.onclick=function(){
			alert('div元素')
		}
		var body1 = document.getElementsByTagName('body')[0]
		body1.onclick=function(){
			alert('body元素')
		}
		var html1 = document.getElementsByTagName('html')[0]
		html1.onclick=function(){
			alert('html元素')
		}
	</script>
</html>

运行实例 »

    当你单击了页面中的<div>元素后,这个click事件会按照如下顺序传播

  • Element div

  • Element body

  • Element html

  • Document

    从<div元素沿着DOM树向上传播(但是不同的浏览器不同的版本是有着细微的差别的,有的会冒泡到window对象)只要这个元素上存在该事件(这里是click事件)就会触发该事件。

js事件捕获

捕捉和冒泡是传播的方向是相反的。

还是上面的例子

当你单击了页面中的<div>元素后,这个click事件会按照如下顺序传播

  • Document

  • Element html

  • Element body

  • Element div

先触发Document上的再依次往下传播最终到 用户触发的那个元素节点(这里是<div>元素)。

阻止事件冒泡


     

实例

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="myDiv">Click me</div>
</body>
<script type="text/javascript">
		var myDiv = document.getElementById('myDiv');
		myDiv.onclick=function(e){
			alert('div元素')
			var ev = e || window.event;
            	        if(ev && ev.stopPropagation) {
            	          //非IE浏览器
            	          ev.stopPropagation();
            	        } else {
            	          //IE浏览器(IE11以下)
            	          ev.cancelBubble = true;
            	        }
		}
		var body1 = document.getElementsByTagName('body')[0]
		body1.onclick=function(){
			alert('body元素')
			
		}
		var html1 = document.getElementsByTagName('html')[0]
		html1.onclick=function(){
			alert('html元素')
		}
	</script>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

    

这里介绍两个函数

addEventListener(event, listener, useCapture) 给元素追加事件

event :事件(如:click,等)必填

listener:函数 当触发上面的事件时要执行代码。(这里一般写函数名来调用函数) 必选

useCapture:若是true,则表示采用事件捕获,若是false,则表示采用事件冒泡。

removeEventListener(type, listener, useCapture) 移除追加的事件

type:事件(如:click,等)必填

listener:函数 

useCapture:若是true,则表示采用事件捕获,若是false,则表示采用事件冒泡。

你有可能会移除失败。原因是removeEventListener与addEventListener中的参数必须相同而且  listener 函数必须使用函数名来调用不能直接写 function 来定义,因为在内存中的位置不同,removeEventListener会认为是不同的 函数所以会移除失败。



声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议