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

本文深入探讨了事件流的概念,包括冒泡型事件和捕捉型事件的工作原理。解释了如何在不同浏览器环境下通过addEventListener方法控制事件触发顺序,以及如何使用W3C标准或IE专有方法阻止事件冒泡和取消默认事件。

什么是事件流?

浏览器最初开始支持事件时,同一个事件仅仅只有一个元素相应。后来认为仅仅支持一个单一事件是不够的,而IE4之后提出了事件流的概念,一个元素可以支持多个事件。常见的事件流有冒泡型事件和捕捉型事件。

 事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件 ;需要注意的是IE浏览器不支持捕获类型事件;相反的,事件冒泡是自下而上的去触发事件

添加事件监听时阻止冒泡

绑定事件方法 addEventListener 的第三个参数,就是控制事件触发顺序是否为事件捕获。true,事件捕获;false,事件冒泡。默认false,即事件冒泡。

// 阻止冒泡前 

document.getElementById("parent").addEventListener("click",function(e){
                alert("parent事件被触发");
})
document.getElementById("child").addEventListener("click",function(e){
                alert("child事件被触发")
})
 
//  阻止冒泡后

document.getElementById("parent").addEventListener("click",function(e){
                alert("parent事件被触发");
},true)
document.getElementById("child").addEventListener("click",function(e){
                alert("child事件被触发")
},true)

直接绑定事件时阻止冒泡

w3c的方法是e.stopPropagation(),IE则是使用e.cancelBubble = true

<div id='div' onclick='alert("div");'>
  <ul onclick='alert("ul");'>
     <li onclick='alert("li");'>test</li>
  </ul>
</div>

// 先触发li; 再触发ul; 然后触发div

 阻止冒泡

function stopBubble(e) { 
//如果提供了事件对象,则这是一个非IE浏览器 
if ( e && e.stopPropagation ) {
    //因此它支持W3C的stopPropagation()方法 
    e.stopPropagation(); 
} else { 
    //否则,我们需要使用IE的方式来取消事件冒泡 
    window.event.cancelBubble = true; 
}

取消默认事件

默认行为即标签本身自带的行为,如<a>标签的默认跳转、<input type="submit" >等

<a href="http://www.baidu.com/" id="test" >百度一下,你就知道</a>


var a = document.getElementById("test");
a.onclick =function(e){
     if(e && e.preventDefault){
          e.preventDefault();    //  W3C取消默认事件
      }else{
          window.event.returnValue == false;  //IE中阻止函数器默认动作的方式 
      }
}


//  或者可以使用return false

a.onclick = function(){
    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()` - 两者可独立使用,也可根据需求组合使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值