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 相关文章推荐
模拟电子签章盖章效果的jQuery插件源码
Jun 24 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
Jul 12 Javascript
JSON传递bool类型数据的处理方式介绍
Sep 18 Javascript
javascript 函数声明与函数表达式的区别介绍
Oct 05 Javascript
javascript中验证大写字母、数字和中文
Jan 15 Javascript
封装好的一个万能检测表单的方法
Jan 21 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
Sep 06 Javascript
js调用屏幕宽度的简单方法
Nov 14 Javascript
canvas 绘制圆形时钟
Feb 22 Javascript
微信小程序与php 实现微信支付的简单实例
Jun 23 Javascript
jquery图片放大镜效果
Jun 23 jQuery
详解Webpack多环境代码打包的方法
Aug 03 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编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
浅谈javascript中遇到的字符串对象处理
2016/11/18 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
用python实现面向对像的ASP程序实例
2014/11/10 Python
python 实现登录网页的操作方法
2018/05/11 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
Python离线安装PIL 模块的方法
2019/01/08 Python
利用nohup来开启python文件的方法
2019/01/14 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
幼儿园大班开学寄语
2014/08/02 职场文书
滴水洞导游词
2015/02/10 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP