jQuery 事件冒泡

举报
达拉崩巴斑得贝迪卜多 发表于 2021/12/28 16:21:21 2021/12/28
【摘要】 jQuery 事件冒泡解释官方解释:在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。 事件冒...

jQuery 事件冒泡解释

官方解释:
在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。

事件冒泡示例

如果我们在一个页面中定义了多个事件,比如鼠标点击事件,而且这些事件所绑定的元素是嵌套关系的话,就会出现事件冒泡的现象,具体代码如下:

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<script src="jquery.min.js"></script>
		<script type="text/javascript">
			$(document).ready(function(){
				$("body").click(function(){
					alert("aaa");
				});
				$("div").click(function(){
					alert("bbb");
				});
				$("a").click(function(){
					alert("ccc");
				});
			});
		</script>
	</head>

	<body>
		<div>
			<a href="javascript:;">点击按钮</a>
		</div>
	</body>
</html>

上面代码中共有三个事件,分别是:body、div、a标签都绑定了点击事件,在页面中当单击a标签会连续弹出3个提示框,这就是事件冒泡引起的现象。弹框的顺序分别为:ccc、bbb、aaa,说明事件冒泡的过程是:a --> div --> body 。a冒泡到div冒泡到body。

事件冒泡的作用

事件冒泡允许多个操作被集中处理(把事件处理器添加到一个父级元素上,避免把事件处理器添加到多个子级元素上),它还可以让你在对象层的不同级别捕获事件。

阻止事件冒泡

本来在上面的代码中只想触发元素的onclick事件,然而

,<body>事件也同时 触发了。因此我们必须要对事件的作用范围进行限制。当单击元素的onclick事件时只触发本身的事件。由于IE- DOM和标准DOM实现事件对象的方法各不相同,导致在不同浏览器中获取事件的对象变得比较困难。如果想阻止事件的传递,我们可以用event.stopPropagation() 阻止事件的传递行为。

方法一:使用stopPropagation()函数

<!DOCTYPE html>
<html lang="en">
  <head>
  	<meta charset="UTF-8">
  	<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
  	<script type="text/javascript">
  		$(document).ready(function(){
  			$("body").click(function(){
  				alert("aaa");
  			});
  			$("div").click(function(e){
  				alert("bbb");
  				//阻止冒泡
  				e.stopPropagation();
  			});
  			$("a").click(function(){
  				//不阻止冒泡
  				alert("ccc");
  			});
  		});
  	</script>
  </head>

  <body>
  	<div>
  		<a href="javascript:;">点击按钮</a>
  	</div>
  </body>
</html>

上面代码中,对

阻止了事件冒泡,点击超链接后,只会弹出显示ccc和bbb的弹框,说明事件冒泡到div层就被阻止掉了,不会再向外层继续冒泡。

方法二:使用return false阻止冒泡

<!DOCTYPE html>
<html lang="en">
  <head>
  	<meta charset="UTF-8">
  	<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
  	<script type="text/javascript">
  		$(document).ready(function(){
  			$("body").click(function(){
  				alert("aaa");
  			});
  			$("div").click(function(){
  				alert("bbb");
  				//阻止冒泡
  				return false;
  			});
  			$("a").click(function(){
  				//不阻止冒泡
  				alert("ccc");
  			});
  		});
  	</script>
  </head>

  <body>
  	<div>
  		<a href="javascript:;">点击按钮</a>
  	</div>
  </body>
</html>

上面代码中,当鼠标移入Mouseover所在元素及其子元素时,就会触发mouseover事件,是存在事件冒泡的。而当鼠标移入Mouseenter所在的元素时,触发了mouseenter事件,但是鼠标移入其子元素时,就没有触发mouseenter事件,证明是不存在事件冒泡的。

mouseleave()与mouseout() 事件的区别

mouseout 事件在鼠标离开任意一个子元素及选的元素时触发(存在事件冒泡),mouseleave 事件只在鼠标离开选取的的元素时触发(不存在事件冒泡)。

<!DOCTYPE html>
<html>
  <head>
      <meta charset="utf-8"> 
      <script src="jquery.min.js"></script>
      <script>
          x=0;
          y=0;
          $(document).ready(function(){
            $("div.over").mouseout(function(){
              $(".over span").text(x+=1);
            });
            $("div.enter").mouseleave(function(){
              $(".enter span").text(y+=1);
            });
          });
      </script>
  </head>
  <body>
      <div class="over" 
           style="background-color:lightgray;padding:20px;width:250px;float:left">
          <h3 
              style="background-color:white;">
              Mouseout 事件触发: 
              <span></span
           ></h3>
      </div>

      <div class="enter" 
           style="background-color:lightgray;padding:20px;width:250px;float:right">
          <h3 
              style="background-color:white;">
              Mouseleave 事件触发: 
              <span></span>
          </h3>
      </div>

  </body>
</html>

上面代码中,当鼠标移出Mouseout所在元素及其子元素时,就会触发mouseout事件,是存在事件冒泡的。而当鼠标移出Mouseleave所在的元素时,触发了mouseleave事件,但是鼠标移出其子元素时,就没有触发mouseleave事件,证明是不存在事件冒泡的。

总结

事件冒泡是浏览器中的默认行为,比如触发一个元素绑定的事件,如果其父元素或子元素也有同样的事件绑定,那么事件就会一层一层的去执行,我们把这种行为称为”事件冒泡“。阻止浏览器事件冒泡可以使用event对象中的 event.stopPropagation() 方法或者是直接在事件的回调函数中返回false。

在使用鼠标移入移出事件时,根据业务的实际需求,来选择不同的事件方法。如果需要事件冒泡,就可以使用mouseover和mouseout事件,如果不需要事件冒泡,就可以使用mouseenter和mouseleave事件。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。