JS中如何阻止事件的传播

一个事件发生后,会在子元素和父元素之间传播(propagation)。这种传播分成三个阶段。这种三阶段的传播模型,使得同一个事件会在多个节点上触发。

  • 第一阶段:从window对象传导到目标节点(上层传到底层),称为“捕获阶段”(capture phase)。
  • 第二阶段:在目标节点上触发,称为“目标阶段”(target phase)。
  • 第三阶段:从目标节点传导回window对象(从底层传回上层),称为“冒泡阶段”(bubbling phase)。

如果希望事件到某个节点为止,不再传播,可以使用事件对象的stopPropagation方法。stopPropagation方法阻止事件在 DOM 中继续传播,防止再触发定义在别的节点上的监听函数,但是不包括在当前节点上其他的事件监听函数。

// 事件传播到 p 元素后,就不再向下传播了
p.addEventListener('click', function (event) {
  event.stopPropagation();
}, true);

// 事件冒泡到 p 元素后,就不再向上冒泡了
p.addEventListener('click', function (event) {
  event.stopPropagation();
}, false);

案例:
(1)不阻止事件传播的情况

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>32.事件监听</title>
  <style>
    div{
      width: 300px;
      height: 200px;
      border: 1px solid red;
    }

    p{
      width: 100px;
      height: 100px;
      border: 1px solid black;
    }
  </style>
</head>
<body>
<div id="div1">
  hello
  <p id="p1">world</p>
</div>

</body>

<script>
  let div1 = document.getElementById('div1');
  let p1 = document.getElementById('p1');
  
  div1.addEventListener('click',function () {
    console.log('div1');
  });
  p1.addEventListener('click',function (event) {
    console.log(1);
  });
  p1.addEventListener('click',function () {
    console.log(2);
  });
  p1.addEventListener('click',function () {
    console.log(3);
  });
</script>
</html>

在这里插入图片描述
(2)使用stopPropagation阻止事件传播,可以看出外层的div绑定的click事件没有触发。

p1.addEventListener('click',function (event) {
  // 只能阻止这个事件的传播,但是不能取消事件,后边绑定的click监听函数可以正常触发
  event.stopPropagation();
  console.log(1);
});

在这里插入图片描述
stopPropagation方法只会阻止事件的传播,不会阻止该事件触发<p>节点的其他click事件的监听函数,也就是说后边绑定的click监听函数可以正常触发。

(3)使用stopImmediatePropagation
如果想要彻底取消该事件,不再触发后面所有click的监听函数,可以使用stopImmediatePropagation方法。

stopImmediatePropagation方法阻止同一个事件的其他监听函数被调用,不管监听函数定义在当前节点还是其他节点。也就是说,该方法阻止事件的传播,比stopPropagation()更彻底。

如果同一个节点对于同一个事件指定了多个监听函数,这些函数会根据添加的顺序依次调用。只要其中有一个监听函数调用了stopImmediatePropagation方法,其他的监听函数就不会再执行了。

p1.addEventListener('click',function (event) {
  // 使得后面绑定的所有click监听函数都不再触发,但是当前的还是可以正常触发
  event.stopImmediatePropagation();
  console.log(1);
});

在这里插入图片描述

前端学习交流QQ群,群内学习讨论的氛围很好,大佬云集,期待您的加入:862748629 点击加入

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在JavaScript阻止事件冒泡有几种方法。一种常用的方法是使用`stopPropagation()`函数。这个函数可以在事件处理程序调用,它会阻止事件继续传播到父元素。具体的代码如下所示: ```javascript function(event) { if (event.stopPropagation) { event.stopPropagation(); // W3C标准的阻止冒泡方法 } else { event.cancelBubble = true; // IE的阻止冒泡方法 } return false; } ``` 还有一种方法是使用`preventDefault()`函数。这个函数可以阻止默认的事件行为发生。例如,如果你在点击一个链接时调用了这个函数,链接将不会被打开。具体的代码如下所示: ```javascript $('.btn').click(function(event) { event.preventDefault(); alert('按钮被点击了'); }); ``` 另外,还可以用`return false`来阻止事件冒泡和取消默认事件。这相当于同时调用了`event.stopPropagation()`和`event.preventDefault()`。例如: ```javascript $('.btn').click(function(event) { // 阻止事件冒泡和取消默认事件 return false; }); ``` 以上是几种常见的阻止事件冒泡的方法。根据具体的需求和场景,可以选择适合的方法来进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [js 阻止事件冒泡](https://blog.csdn.net/weixin_44805839/article/details/125545407)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JS阻止冒泡事件的三种方法](https://blog.csdn.net/weixin_43967603/article/details/96307321)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值