热门标签 | 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



推荐阅读
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
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社区 版权所有