JS中事件冒泡和事件捕获介绍


Posted in Javascript onDecember 13, 2016

谈起JavaScript的 事件,事件冒泡、事件捕获、阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免。
事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target)。
事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。

1、冒泡事件:

事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。通俗来讲就是,就是当设定了多个div的嵌套时;即建立了父子关系,当父div与子div共同加入了onclick事件时,当触发了子div的onclick事件后,子div进行相应的js操作,但是父div的onclick事件同样会被触发。

html:

<div>
 <input type="button" value="测试事件冒泡" />
</div>

js:

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")
   }

效果:依次弹出”red“,"green","yellow"。这就是事件冒泡:触发button这个元素,却连同父元素绑定的事件一同触发。

2、阻止事件冒泡

如果对input的事件绑定改为:

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

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

3、事件捕获:

从顶层元素到目标元素或者从目标元素到顶层元素,和事件冒泡是一个相反的过程。事件从最不精确的对象(document 对象)开始触发,然后到最精确(也可以在窗口级别捕获事件,不过必须由开发人员特别指定)。

$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"。这就是事件的捕获。 

如果把addEventListener方法的第三个参数改成false,则表示只在冒泡的阶段触发,弹出的依次为:”red“,"green","yellow"。这是因为在W3C模型中,任何事件发生时,先从顶层开始进行事件捕获,直到事件触发到达了事件源元素。然后,再从事件源往上进行事件冒泡,直到到达document。

程序员可以自己选择绑定事件时采用事件捕获还是事件冒泡,方法就是绑定事件时通过addEventListener函数,它有三个参数,第三个参数若是true,则表示采用事件捕获,若是false,则表示采用事件冒泡。

ele.addEventListener('click',doSomething2,true)
true=捕获
false=冒泡

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

Javascript 相关文章推荐
深入分析js中的constructor和prototype
Apr 07 Javascript
图片上传判断及预览脚本的效果实例
Aug 07 Javascript
jquery中的查找parents与closest方法之间的区别
Dec 02 Javascript
判断字符串的长度(优化版)中文占两个字符
Oct 30 Javascript
JS实现DIV容器赋值的方法
Dec 14 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
Bootstrap table简单使用总结
Feb 15 Javascript
将jquery.qqFace.js表情转换成微信的字符码
Dec 01 jQuery
Vue之mixin全局的用法详解
Aug 22 Javascript
angularjs自定义过滤器demo示例
Aug 24 Javascript
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
JavaScript文档对象模型DOM
Nov 20 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
Dec 13 #Javascript
解决Window10系统下Node安装报错的问题分析
Dec 13 #Javascript
浅析Jquery操作select
Dec 13 #Javascript
Vue.js使用v-show和v-if的注意事项
Dec 13 #Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
Dec 13 #Javascript
Es6 写的文件import 起来解决方案详解
Dec 13 #Javascript
JS实现图片垂直居中显示小结
Dec 13 #Javascript
You might like
Terran历史背景
2020/03/14 星际争霸
Windows中使用计划任务自动执行PHP程序实例
2014/05/09 PHP
php HTML无刷新提交表单
2016/04/05 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
用JS实现的一个include函数
2007/07/21 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
浅析node.js中close事件
2014/11/26 Javascript
js中document.write的那点事
2014/12/12 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
基于javascript实现图片预加载
2016/01/05 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
Python any()函数的使用方法
2019/10/28 Python
python爬虫---requests库的用法详解
2020/09/28 Python
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
餐饮营销方案
2014/02/23 职场文书
职称评定自我鉴定
2014/03/18 职场文书
幼儿园教师师德师风演讲稿:爱我所爱 无悔青春
2014/09/10 职场文书
项目建议书
2015/02/04 职场文书
酒店辞职书范文
2015/02/26 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
一个成功的互联网创业项目,必须满足这些要求
2019/08/23 职场文书
Python装饰器详细介绍
2022/03/25 Python