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 相关文章推荐
javascript脚本调试方法小结
Nov 24 Javascript
javascript错误的认识不用关心内存管理
Dec 15 Javascript
JS批量操作CSS属性详细解析
Dec 16 Javascript
jQuery中Form相关知识汇总
Jan 06 Javascript
js实现页面刷新滚动条位置不变
Nov 27 Javascript
js获取json中key所对应的value值的简单方法
Jun 17 Javascript
Vue.Draggable实现拖拽效果
Jul 29 Javascript
Node.js pipe实现源码解析
Aug 12 Javascript
vue用递归组件写树形控件的实例代码
Jul 19 Javascript
Vue父子组件之间的通信实例详解
Sep 28 Javascript
PHP读取远程txt文档到数组并实现遍历
Aug 25 Javascript
JavaScript声明变量和数据类型的转换
Apr 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中使用php5-ffmpeg撷取视频图片实例
2015/01/07 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
PHP 裁剪图片
2021/03/09 PHP
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
javascript模块化简单解析
2016/04/07 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
2016/10/25 Javascript
javascript 跨域问题以及解决办法
2017/07/17 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
python测试驱动开发实例
2014/10/08 Python
python解析xml文件实例分析
2015/05/27 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
基于python图书馆管理系统设计实例详解
2020/08/05 Python
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
幼儿园大班毕业教师寄语
2014/04/03 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
2015年教研组工作总结
2015/05/04 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
毕业班工作总结
2015/08/10 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang