热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何阻止冒泡浏览器默认行为

如何阻止冒泡&&浏览器默认行为2018-12-2710:20byJerremyZhang,阅读,评论,收藏,编辑摘要很多同学对阻止事件冒泡和阻止事件默认行为容易混淆&#

如何阻止冒泡&&浏览器默认行为

2018-12-27 10:20 by JerremyZhang, ... 阅读, ... 评论, 收藏, 编辑

摘要

很多同学对阻止事件冒泡和阻止事件默认行为容易混淆,项目中因为一些原因也需要阻止浏览器的一些默认行为,这里就简单总结一下。

阻止事件冒泡

什么是事件冒泡这里就不再赘述了,网上的文章一大把,这里就简述一下如何阻止事件冒泡,阻止事件冒泡在使用浏览器原生API的情况下,是需要分情况考虑的,毕竟有个个性的浏览器IE,这里分为IE实现和W3C标准实现。
在W3C标准实现中,我们阻止事件冒泡可以很容易使用标准API
基本语法:

event.stopPropagation();

IE实现下(这里主要指IE低版本IE9以下版本,因为IE9也实现了W3C标准)
基本语法:

event.cancelBubble = bool;

当然IE标准并不是只有IE支持,其实很多浏览器都实现了cancelBubble支持,但是后来虽然浏览器没有取消对cancelBubble属性的支持,设置了之后也会无效,所以建议的兼容语法是:

function eventCallback(e){e = e||window.event;if(e.stopPropagation){ //通过浏览器能力进行兼容性检测e.stopPropagation(); }else if(e.cancelBubble){e.cancelBubble = true;}
}

当然说到阻止事件冒泡这个问题,也要简单提一下 event.stopPropagation 和event.stopImmediatePropagation的异同点:

  • 相同点是两者都能阻止标准事件注册方式注册的事件 (addEventListener,IE是attachEvent)向父级节点继续冒泡
  • 不同点从名字上可以看出,Immediate立即的意思,event.stopImmediatePropagation 不止能阻止往父级节点冒泡,还能阻止当前节点其它事件的继续执行(比如往一个元素上注册了多个事件,那么在第一个事件执行的时候,通过调用event.stopImmediatePropagation,会阻止其它事件的执行)

上面代码需要注意的一点是,IE下e不存在,从window中获取,简单做了兼容处理。可以尝试使用return false

阻止浏览器默认行为

在开始之前,首先需要了解什么是浏览器的默认行为,我这里简单举几个例子:

  1. 点击a标签,如果设置了href会执行跳转
  2. 点击输入框,输入框会获取焦点
  3. 点击右键,会弹出浏览器右键菜单
  4. 点击submit,会提交其所在表单
  5. 点击checkbox 会选中或者反选

还有其他的很多,这里就不一一列举了

同样的对于阻止浏览器默认行为的实现也分为W3C标准实现和IE实现(这里也只是指IE9以下的实现)

在W3C标准实现中,其基本语法如下:

event.preventDefault();

在IE实现中,其基本语法如下:

window.event.returnValue = false;

所以其兼容版本伪代码如下


function eventCallback(e){e = e || window.event;if(e.preventDefault){e.preventDefault()}else {e.returnValue = false;}
}

这里简单那checkbox做一个小的demo:


Please click on the checkbox

有兴趣的其它场景都可以写个小demo 玩玩。

同样W3C标准实现中,我们可以通过event.defaultPrevented 来确定event.preventDefault方法是否被调用,基本模式如下:

if (e.defaultPrevented) {/* the default was prevented */}

当然不是所有的事件都可以被cancel,浏览器也提供了cancelable属性来判断事件是否可以被取消,如果cancelable为false,那么便无法阻止浏览器的默认行为,如果在一个不可撤销的事件上调用preventDefault,会抛出错误,所以建议在调用之前判断事件是否可被取消.

下面是一个来自于mdn的例子,有兴趣的可以直接看原文

https://developer.mozilla.org/en-US/docs/Web/API/Event/cancelable

浏览器厂商提议滚轮事件只有第一次可被取消

function preventScrollWheel(event) {if (typeof event.cancelable !== 'boolean' || event.cancelable) {// The event can be canceled, so we do so.event.preventDefault();} else {// The event cannot be canceled, so it is not safe// to call preventDefault() on it.console.warn(`The following event couldn't be canceled:`);console.dir(event);}
}document.addEventListener('wheel', preventCancelableEvents);

# 总结
阻止默认冒泡和阻止浏览器默认行为需要关注的是兼容性问题,其它内容大家只需要关注mdn,已经很详细的列出了兼容问题,对前端&node有兴趣的欢迎微信交流,如果你能看到弹框弹出微信二维码的话?。

附录

每个API的浏览器兼容情况如下:
event.stopPropagation

418791-20181227101259592-3920188.png

event.stopImmediatePropagation

418791-20181227101405390-1202764066.png

window.event.returnValue

418791-20181227101456801-1342794265.png

event.preventDefault

418791-20181227101542473-565947825.png

event.cancelable

418791-20181227101615842-121883487.png

event.cancelBubble

418791-20181227101803612-1312345736.png



推荐阅读
  • Node.js 中 GET 和 POST 请求的数据处理
    本文详细介绍了如何在 Node.js 中使用 GET 和 POST 方法来处理客户端发送的数据。通过示例代码展示了如何解析 URL 参数和表单数据,并提供了完整的实现步骤。 ... [详细]
  • 本文详细介绍了如何使用JavaScript实现数据的双向绑定,包括MVVM架构的基本概念、不同框架下的实现方式以及具体的代码示例。 ... [详细]
  • 利用HTML5 Canvas高效构建电信网络拓扑图
    电信网络拓扑图在实际应用中具有很高的实用价值。本文介绍了一个基于HTML5 Canvas的电信网络拓扑图项目,不仅实现了基本的图形展示功能,还加入了自动布局和属性栏功能,使项目更加完善。此Demo经过细微调整即可直接应用于实际项目中。 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
  • 本文提供了多种方法来计算给定年份和月份的起始日和结束日,并进一步探讨了如何根据年、月、周获取特定周的起始日和结束日。 ... [详细]
  • 交互式左右滑动导航菜单设计
    本文介绍了一种使用HTML和JavaScript实现的左右可点击滑动导航菜单的方法,适用于需要展示多个链接或项目的网页布局。 ... [详细]
  • Android中解析XML文件的实践指南
    本文详细介绍了在Android应用开发中解析XML文件的方法,包括从本地文件和网络资源获取XML文件的不同途径,以及使用DOM、SAX和PULL三种解析方式的具体实现。 ... [详细]
  • 本文详细介绍了ASP.NET缓存的基本概念和使用方法,包括输出缓存、数据缓存及其高级特性,如缓存依赖、自定义缓存和缓存配置文件等。通过合理利用这些缓存技术,可以显著提升Web应用程序的性能。 ... [详细]
  • 本文详细探讨了JavaScript中的闭包与柯里化技术,这两者是函数式编程的重要组成部分,对提升代码的灵活性和可维护性具有重要作用。 ... [详细]
  • C++ 中的可调用对象及其应用
    本文介绍了 C++ 中的可调用对象概念,包括函数指针、仿函数、类成员函数指针等,并详细探讨了 `std::function` 和 `std::bind` 在统一处理这些可调用对象时的作用和实现方法。 ... [详细]
  • 目录介绍01.CoordinatorLayout滑动抖动问题描述02.滑动抖动问题分析03.自定义AppBarLayout.Behavior说明04.CoordinatorLayo ... [详细]
  • 本文详细介绍了如何在UniApp中集成H5微信公众号支付功能,包括前置条件、API调用方法及具体实现步骤。 ... [详细]
  • 博主从零开始学习HTML(入门基础)
    从零开始学习HTML(入门基础)互联网三大基石HTTP协议URL:统一资源定位符HTML:超文本标记语言HTML的Head标签中的常用元素<!--告知 ... [详细]
  • C++网络编程:连接成功后的回调机制及前端视角下的异步编程解析
    本文探讨了C++网络编程中连接成功后的回调机制,并从一个前端开发者的角度深入浅出地介绍了异步编程的基本概念及其重要性,特别强调了JavaScript中异步编程的各种实现方式。 ... [详细]
  • 双向数据绑定技术使得对象属性与用户界面之间可以相互影响,即对象属性的更改能即时反映到界面上,同时用户的界面操作也能同步更新对象状态。本文将介绍如何利用简单的JavaScript代码实现这一功能。 ... [详细]
author-avatar
KING逊咖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有