JS阻止事件冒泡和默认事件

本文深入探讨了事件冒泡机制及其在DOM操作中的应用,解释了如何在现代浏览器和IE中有效阻止事件冒泡与默认事件,以实现精确的事件处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转载自掘金中我的小伙伴的一篇文章https://juejin.im/post/5bf7ad096fb9a049ed308353

什么是事件冒泡?

当事件发生后,这个事件就要开始传播(从里到外,或者从外向里)。为什么要传播呢?因为事件源本身(可能)并没有处理事件的能力,或处理事件的函数并未绑定在该事件源上。如下图:

      我们经常利用事件冒泡机制去减少给DOM添加过多的绑定事件即事件委托,但是有时候事件冒泡也会比较烦人,影响我们的事件正常处理机制,如下:

<body>
<div id="info">
  <div class="box-1" onclick="box1()">
    最外层
    <div class="box-2" onclick="box2()">
      第二层
      <div class="box-3" onclick="box3()">
        第三层
        <div class="box-4" onclick="bubbles()">最底</div>
      </div>
    </div>
  </div>
</div>
<script>
  function bubbles(){
    console.log("最底层盒子被点击了")
  }

  function box1(){
    console.log("最外层盒子被点击了");
  }

  function box2(){
    console.log("第二个盒子被点击了");
  }

  function box3(){
    console.log("第三个盒子被点击了");
  }
</script>
</body>复制代码

 

如何阻止事件冒泡?

由上图我们可以看出,我们只点击了最里面的那个div,但是在他的父级及以上div身上所绑定的事件都被触发了,这显然不是我们想要的结果,我们实际需求是只想要触发点击的那个div上绑定的事件,我们该如何阻止浏览器的这种事件处理机制呢?

function bubbles(e){
  var ev = e || window.event;
  if(ev && ev.stopPropagation) {
    //非IE浏览器
    ev.stopPropagation();
  } else {
    //IE浏览器(IE11以下)
    ev.cancelBubble = true;
  }
  console.log("最底层盒子被点击了")
}复制代码

 

这样我们就可以实现点击哪个div触发哪个div的方法,而对其他div不造成影响了

阻止默认事件

一共有如下三种方式:

//谷歌及IE8以上
e.preventDefault();
//IE8及以下
window.event.returnValue = false;
//无兼容问题(但不能用于节点直接onclick绑定函数)
return false;复制代码

具体用法:

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>阻止默认事件</title>
</head>
<body>
<div id="info">
  <a href="www.baidu.com" id="test">阻止默认事件</a>
</div>
<script>
  var aDom = document.getElementById('test');
  aDom.onclick = function ( e ){
    if(e && e.preventDefault) {
      //非IE浏览器
      e.preventDefault();
    } else {
      //IE浏览器(IE11以下)
      window.event.returnValue = false;
    }
    //return false;   //或者不写上面的判断直接写这句
  };
</script>
</body>
</html>复制代码

使用return false的注意点

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>阻止默认事件</title>
</head>
<body>
<div id="info">
  <a href="www.baidu.com" onclick="defaultEvent()">阻止默认事件</a>
</div>
<script>
  function defaultEvent(){
    return false;
  }
</script>
</body>
</html>复制代码

以上代码,完全无效,无法通过这个函数阻止a标签的跳转,return false不能适用于直接用onclick绑定的事件,所以当我们使用这种绑定事件方式时,我们还是需要采用e.preventDefault()这个函数

在jQuery中使用return false时,相当于同时使用event.preventDefault和event.stopPropagation,它会阻止冒泡也会阻止默认行为。 但是使用原生js写时,return false只会阻止默认行为。


 

 

 

<think>嗯,用户问的是阻止事件冒泡阻止默认事件的区别。我需要先回忆一下这两个概念的具体含义,然后找出它们的区别应用场景。 首先,事件冒泡是DOM中的事件传播机制,比如点击一个子元素,事件会向上级父元素逐层触发。阻止冒泡就是让事件不再继续上传,比如在子元素处理完事件后,不让父元素接收到这个事件。常用的是event.stopPropagation()方法。 然后是默认事件,指的是浏览器对某些元素的默认行为,比如点击链接会跳转,表单提交会刷新页面。阻止默认事件就是取消这些默认行为,使用event.preventDefault()方法。 需要区分两者的使用场景。比如,如果一个链接绑定了点击事件处理函数,但不想让点击后跳转,就要阻止默认事件。而如果同一个页面上有多个嵌套元素绑定点击事件,可能需要在某个子元素处理完后阻止冒泡,避免父元素的事件处理函数被触发。 可能用户在实际开发中遇到了事件重复触发或者默认行为干扰的问题,需要明确这两个方法的区别。要确保回答结构清晰,用例子说明,避免混淆。 还要注意使用中文,按照系统级指令正确使用LaTeX格式,但这里可能用不上数学表达式。重点在于逻辑清晰,步骤分明,帮助用户理解两者的区别应用。</think>### 阻止事件冒泡默认事件的区别 #### 1. **事件冒泡(Event Bubbling)** - **定义**:事件从触发它的最深层元素(目标元素)开始,逐层向上传播到父元素的过程。 - **阻止方法**:调用 `event.stopPropagation()`。 - **作用**:**仅阻止事件向父级传播**,不影响当前元素的事件处理逻辑或默认行为。 - **使用场景**: 例如,当子元素父元素都绑定了点击事件时,若希望子元素触发后父元素不响应: ```javascript document.getElementById("child").addEventListener("click", function(event) { event.stopPropagation(); // 父元素不会收到此点击事件 console.log("子元素被点击"); }); ``` #### 2. **默认事件(Default Event)** - **定义**:浏览器对某些元素预设的行为(如点击链接跳转、表单提交刷新页面)。 - **阻止方法**:调用 `event.preventDefault()`。 - **作用**:**仅取消浏览器默认行为**,不阻止事件传播。 - **使用场景**: 例如,阻止表单自动提交或禁止链接跳转: ```javascript document.querySelector("a").addEventListener("click", function(event) { event.preventDefault(); // 阻止链接跳转,但事件仍会冒泡到父元素 console.log("链接点击被阻止"); }); ``` --- #### 3. **核心区别** | **特性** | 阻止事件冒泡 (`stopPropagation`) | 阻止默认事件 (`preventDefault`) | |-------------------|---------------------------------------|---------------------------------------| | **影响范围** | 阻止事件向上传播 | 取消浏览器默认行为 | | **事件是否执行** | 当前元素的事件仍会触发 | 当前元素的事件仍会触发 | | **典型用例** | 避免父级元素触发相同事件 | 阻止表单提交、链接跳转等 | --- #### 4. **联动使用示例** ```javascript document.querySelector("button").addEventListener("click", function(event) { event.preventDefault(); // 阻止表单提交(默认行为) event.stopPropagation(); // 阻止事件冒泡到父容器 console.log("按钮点击被处理"); }); ``` - **效果**: - 表单不会提交 - 父容器的点击事件不会被触发 --- #### 5. **总结** - 若需 **隔离事件传播**,用 `event.stopPropagation()` - 若需 **禁用浏览器默认行为**,用 `event.preventDefault()` - 两者可独立使用,也可根据需求组合使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值