js事件冒泡、事件捕获和阻止默认事件详解


Posted in Javascript onAugust 04, 2016

谈起JavaScript的 事件,事件冒泡、事件捕获、阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免。

1.事件冒泡
先来看一段代码:

var $input = document.getElementsByTagName("input")[0];
var $div = document.getElementsByTagName("div")[0];
var $body = document.getElementsByTagName("body")[0];

$input.onclick = function(e){
 this.style.border = "5px solid red"
 var e = e || window.e;
 alert("red")
}
 $div.onclick = function(e){
 this.style.border = "5px solid green"
 alert("green")
}
$body.onclick = function(e){
 this.style.border = "5px solid yellow"
 alert("yellow")
}

html代码

<div>
 <input type="button" value="测试事件冒泡" />
</div> 依次弹出”red“,"green","yellow"。

你的本意是触发button这个元素,却连同父元素绑定的事件一同触发。这就是事件冒泡。
如果对input的事件绑定改为:

$input.onclick = function(e){
 this.style.border = "5px solid red"
 var e = e || window.e;
 alert("red")
 e.stopPropagation();
}

这个时候只会弹出”red“,因为阻止了事件冒泡。

2.事件捕获
既然有事件的冒泡,也可以有事件的捕获,这是一个相反的过程。区别是从顶层元素到目标元素或者从目标元素到顶层元素。
来看一段代码:

$input.addEventListener("click", function(){
 this.style.border = "5px solid red";
 alert("red")
}, true)
$div.addEventListener("click", function(){
 this.style.border = "5px solid green";
 alert("green")
}, true)
$body.addEventListener("click", function(){
 this.style.border = "5px solid yellow";
 alert("yellow")
}, true)

这个时候依次弹出”yellow“,"green","red",这就是事件的捕获。

3.阻止默认事件
有一些html元素默认的行为,比如说a标签,点击后有跳转动作;form表单中的submit类型的input有一个默认提交跳转事件;reset类型的input有重置表单行为。如果你想阻止这些浏览器默认行为,JavaScript为你提供了方法。

var $a = document.getElementsByTagName("a")[0];
$a.onclick = function(e){
 alert("跳转动作被我阻止了")
 e.preventDefault();
 //return false;//也可以
}

<a href="http://keleyi.com">柯乐义</a>默认事件没有了。

既然return false 和 e.preventDefault()都是一样的效果,那它们有区别吗?当然有。
仅仅是在HTML事件属性 和 DOM0级事件处理方法中 才能通过返回 return false 的形式组织事件宿主的默认行为。

js事件冒泡、事件捕获和阻止默认事件详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一个Action如何调用两个不同的方法
May 22 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
Jun 20 Javascript
js判断日期时间有效性的方法
Oct 24 Javascript
Bootstrap实现默认导航栏效果
Sep 21 Javascript
JS获取一个未知DIV高度的方法
Aug 09 Javascript
AngularJS指令中的绑定策略实例分析
Dec 14 Javascript
使用vue.js实现联动效果的示例代码
Jan 10 Javascript
基于angular实现模拟微信小程序swiper组件
Jun 11 Javascript
vue项目持久化存储数据的实现代码
Oct 01 Javascript
layui-select动态选中值的例子
Sep 23 Javascript
vue路由权限校验功能的实现代码
Jun 07 Javascript
微信小程序整个页面的自动适应布局的实现
Jul 12 Javascript
使用伪命名空间封装保护独自创建的对象方法
Aug 04 #Javascript
全面解析Angular中$Apply()及$Digest()的区别
Aug 04 #Javascript
window.open不被拦截的简单实现代码(推荐)
Aug 04 #Javascript
js实现多图左右切换功能
Aug 04 #Javascript
window.open打开窗口被拦截的快速解决方法
Aug 04 #Javascript
浅谈js中子页面父页面方法 变量相互调用
Aug 04 #Javascript
JS图片等比例缩放方法完整示例
Aug 03 #Javascript
You might like
PHP的FTP学习(一)
2006/10/09 PHP
PHP4实际应用经验篇(8)
2006/10/09 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
ThinkPHP模型详解
2015/07/27 PHP
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
2018/05/08 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
在python中求分布函数相关的包实例
2020/04/15 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
意大利男装网店:Vrients
2019/05/02 全球购物
护士实习自我鉴定
2013/10/22 职场文书
生产副总岗位职责
2013/11/28 职场文书
体育比赛口号
2014/06/09 职场文书
小学“向国旗敬礼”网上签名寄语活动总结
2014/09/27 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
车位出租协议书范本
2016/03/19 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python