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 相关文章推荐
js使用递归解析xml
Dec 12 Javascript
jQuery实现表格颜色交替显示的方法
Mar 09 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
Apr 12 Javascript
JS常用算法实现代码
Nov 14 Javascript
利用vue实现模态框组件
Dec 19 Javascript
js实现3d悬浮效果
Feb 16 Javascript
jQuery实现上传图片前预览效果功能
Aug 03 jQuery
使用淘宝镜像cnpm安装Vue.js的图文教程
May 17 Javascript
浅谈JS对象添加getter与setter的5种方法
Jun 09 Javascript
微信小程序日期选择器实例代码
Jul 18 Javascript
详解vue 自定义marquee无缝滚动组件
Apr 09 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
Jul 24 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实现禁用IE和火狐的缓存问题
2012/12/03 PHP
php牛逼的面试题分享
2013/01/18 PHP
重新认识php array_merge函数
2014/08/31 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
详解Vue 的异常处理机制
2020/11/30 Vue.js
JS模拟实现京东快递单号查询
2020/11/30 Javascript
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
在python image 中实现安装中文字体
2020/05/16 Python
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
党员公开承诺书内容
2014/05/20 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL