JS 解惑 - 如何阻止事件冒泡和取消默认行为

发布于 2023-11-11 07:41:31 字数 3283 浏览 33 评论 0

什么是事件冒泡?

要了解事件冒泡,我们就得把它跟事件捕获来一起交代!

一组栗子

<div>
    <p>
        <span>
            Click Here
        </span>
    </p>
</div>

加入我给如上 HTML 的三级标签上都加上 Click 事件:

//注意这里的最后一个参数,默认也是 false
document.getElementById('d1').addEventListener('click',function(e){
    console.log('d1');   
},false);

document.getElementById('p1').addEventListener('click',function(e){
    console.log('p1');   
},false);

document.getElementById('s1').addEventListener('click',function(e){
    console.log('s1');   
},false);

当点击页面上的 Click Here 的文字时,控制台会依次打印:

s1
p1
d1

也就是这 3 个事件的触发是由内层标签开始朝外依次进行的。

如果这时候修改一下事件绑定的方式,如下:

//最后一个参数修改为 true
document.getElementById('d1').addEventListener('click',function(e){
    console.log('d1');   
},true);

document.getElementById('p1').addEventListener('click',function(e){
    console.log('p1');   
},true);

document.getElementById('s1').addEventListener('click',function(e){
    console.log('s1');   
},true);

再次点击页面上的 Click Here 的文字时,控制台会依次打印:

d1
p1
s1

原因解释

如何阻止事件冒泡

先说明下,IE 旧的浏览器对于事件的定义不同(<=IE8),所以当你使用旧浏览器的时候,务必考虑兼容性!

function stopPropagation(e){
    if(e && e.stopPropagation){//支持 W3C 的 stopPropagation()方法
        e.stopPropagation();
        return;
    };

    if(window.event){//<=IE8,取消事件冒泡
        window.event.cancelBubble = true;
    };
}

什么是默认行为?

看一些栗子:

  • <a> 标签,我们点击以后默认会跳转到 href 属性配置的地址去,这就是 <a> 的默认行为;
  • <input type="submit"> 如果放在 <form> 标签中,点击后默认会提交该 <form> 表单,这就是 <input type="submit"> 的默认行为;

如何阻止默认行为?

function stopDefault(e){
    if(e && e.preventDefault){//支持 W3C 的 preventDefault()方法
        e.preventDefault();
        return;
    };

    if(window.event){//<=IE8,阻止默认行为
        window.event.returnValue = true;
    };
}

总结

支持 W3C 标准

  • 阻止冒泡: e.stopPropagation
  • 阻止默认行为: e.preventDefault

IE8 及以下非 W3C 标准

  • 阻止冒泡: window.event.cancelBubble = true
  • 阻止默认行为: window.event.returnValue = true

补充

使用 jQuery 的事件方法,直接使用 return false 既可以阻止冒泡也可以阻止默认行为

$(ele).click(function(){
    //...

    //阻止冒泡和默认行为
    return false;
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文