如何阻止冒泡&&浏览器默认行为
摘要
很多同学对阻止事件冒泡和阻止事件默认行为容易混淆,项目中因为一些原因也需要阻止浏览器的一些默认行为,这里就简单总结一下。
阻止事件冒泡
什么是事件冒泡这里就不再赘述了,网上的文章一大把,这里就简述一下如何阻止事件冒泡,阻止事件冒泡在使用浏览器原生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
阻止浏览器默认行为
在开始之前,首先需要了解什么是浏览器的默认行为,我这里简单举几个例子:
- 点击a标签,如果设置了href会执行跳转
- 点击输入框,输入框会获取焦点
- 点击右键,会弹出浏览器右键菜单
- 点击submit,会提交其所在表单
- 点击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:
<!DOCTYPE>
<html>
<head>
<title>preventDefault Demo</title>
</head>
<body>
<h1>Please click on the checkbox</h1>
<form>
<label for="chk_just_for_test">Checkbox:</label>
<input type="checkbox" id="chk_just_for_test"/>
</form>
<script>
let chk = document.querySelector('#chk_just_for_test');
chk.addEventListener('click',e=>{
console.log('sorry ,do not let you check this checkbox');
e.preventDefault(); // 这里不考虑IE低版本兼容性问题
})
</script>
</body>
</html>
有兴趣的其它场景都可以写个小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有兴趣的欢迎微信交流,如果你能看到弹框弹出微信二维码的话
如何阻止冒泡&&浏览器默认行为的更多相关文章
- js阻止冒泡和默认事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jQuery 阻止冒泡和默认事件
jQuery event.preventDefault() 方法 event.preventDefault() 方法阻止元素发生默认的行为. 例如: 当点击提交按钮时阻止对表单的提交 阻止以下 URL ...
- js阻止冒泡和默认事件(默认行为)详解- jquery DefaultPrevented 函数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- angular 点击事件阻止冒泡及默认行为
经常遇到场景:多层级元素绑定ng-click 事件,则底层元素的点击事件存在冒泡现象,怎么解决? 类似原生JS ,只是语法稍有不同,如下: 阻止冒泡 $event.stopPropagation() ...
- 基本event封装:阻止冒泡、默认事件等
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> ...
- Angular ngClick 阻止冒泡和默认行为
这其实是一个很简单的问题,如果你认真查看过Angular官方的API文档,本来不想记录的.但是这个问题不止一次的被人问起,所以今天在记录在这里. 在Angular中已经对一些ng事件如ngClick, ...
- 理解阻止浏览器默认事件和事件冒泡cancelBubble
一.阻止浏览器默认事件 1.先举个例子说什么是 浏览器的默认事件 : 比如有一个输入框,当我按下字母a,就会在输入框显示字母a.就是浏览器本该发生的事情.小孩子一出生就会汲取母乳一样的道理,这些都是先 ...
- 在javascript中的浏览器兼容问题以及兼容浏览器汇总(默认事件,阻止冒泡,事件监听。。。)以及解决方式详解
在javascript中常见的浏览器兼容问题,以及解决方式. 在前端工作当中我们遵循这样的原则:渐进增强和优雅降级 渐进增强(progressive enhancement): 针对低版本浏览器进 ...
- jQuery阻止冒泡和HTML默认操作
1:jQuery是一个快捷简便的JavaScript框架,说道框架可以直接理解为就是对原来底层的东西进行了封装使得开发者能够利用这个框架快速开发. 2:在当今的各个浏览器中都支持事件的冒泡,所谓的冒泡 ...
随机推荐
- PECL的安装和使用
下载并安装pear脚本 cd /usr/local/php/bin/ curl -o go-pear.php http://pear.php.net/go-pear.phar ./php go-pea ...
- Swift 学习笔记 (解决Swift闭包中循环引用的三种方法)
话不多说 直接上代码 class SmartAirConditioner { var temperature:Int = //类引用了函数 var temperatureChange:((Int)-& ...
- python cookbook第三版学习笔记五:datetime
Python中表示时间的模块是datetime,引入下面的模块 from datetime import datetime,timedelta print datetime.today() #打印出 ...
- python之virtualenv 与 virtualenvwrapper 详解
在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...
- NPM 与 Nodejs
安装了Nodejs之后,NPM也安装好了 如何知道当前是否已经安装Nodejs和NPM了呢? node -v //查看当前nodejs的版本 npm -v //查看当前npm的版本 NPM 初始化 n ...
- 请求时token过期自动刷新token
1.在开发过程中,我们都会接触到token,token的作用是什么呢?主要的作用就是为了安全,用户登陆时,服务器会随机生成一个有时效性的token,用户的每一次请求都需要携带上token,证明其请求的 ...
- 农业公司flash动画模板
农业公司flash动画素材下载模板是一款绿色水果蔬菜种植企业的flash动画模板. 下载:http://www.huiyi8.com/sc/10576.html
- app测试点-1
一.安全测试 1.软件权限 1)扣费风险:包括短信.拨打电话.连接网络等. 2)隐私泄露风险:包括访问手机信息.访问联系人信息等. 3)对App的输入有效性校验.认证.授权.数据加密等方面进行检测 4 ...
- 疑难杂症:“代理 XP”组件已作为此服务器安全配置的一部分被关闭。系统管理员可以使用 sp_configure 来启用“代理 XP”。
“代理 XP”组件已作为此服务器安全配置的一部分被关闭.系统管理员可以使用 sp_configure 来启用“代理 XP”.有关启用“代理 XP”的详细信息,请参阅 SQL Server 联机丛书中的 ...
- linux标准输入输出与重定向
原文:http://blog.sina.com.cn/s/blog_8333cf8f0100vzzl.html##1 1. 标准输入输出和错误 linux下使用标准输入文件stdin和标准输出文 ...