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代码
Apr 26 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
Dec 27 Javascript
Jquery操作radio的简单实例
Jan 06 Javascript
浅谈JavaScript 框架分类
Nov 10 Javascript
javascript实现连续赋值
Aug 10 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
Sep 17 Javascript
Javascript中arguments对象的详解与使用方法
Oct 04 Javascript
vue内置组件transition简单原理图文详解(小结)
Jul 12 Javascript
vue中过滤器filter的讲解
Jan 21 Javascript
深入理解es6块级作用域的使用
Mar 28 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
Apr 03 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
Feb 05 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
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
PHP中的extract的作用分析
2008/04/09 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
Yii统计不同类型邮箱数量的方法
2016/10/18 PHP
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
python中redis的安装和使用
2016/12/04 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
python pillow库的基础使用教程
2021/01/13 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
自我评价范文分享
2014/01/04 职场文书
商务邀请函范文
2014/01/14 职场文书
幼儿园元旦亲子活动方案
2014/02/17 职场文书
项目转让协议书
2014/10/27 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
法院答辩状格式
2015/05/22 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS