【JavaScript】事件捕获、事件冒泡与事件委托
2018年12月18日
最近在学习js时,遇到了三个名词:事件捕获、事件冒泡、事件委托。
一、事件捕获和事件冒泡
事件捕获和事件冒泡是为了解决网页中的事件流(事件发生的顺序)而提出的概念。
事件捕获是指事件会从开始发生,直到最具体的元素。
而事件冒泡正好相反,就如同将石子投入水中,波纹是从中心向两边散开。事件冒泡是指事件会从最内层的元素开始发生,一直向外传播。
例:
<div id="outer">
<p id="inner">Click me!</p>
</div>
对同一个click事件,采取事件捕获的方式,则click事件发生的顺序是document -> html -> body -> div -> p;而采用事件冒泡的方式,click事件发生的顺序则是p -> div -> body -> html -> document。
如果div元素和p元素各有一个函数处理click事件,那么采用事件捕获的方式,会先执行div元素的函数,再执行p元素的函数;事件冒泡则正好相反。
事件冒泡案例:
<!DOCTYPE html>
<html lang="en" dir="ltr"> <head>
<meta charset="utf-8">
<title></title>
</head> <body>
<div id="s1">s1
<div id="s2">s2</div>
</div>
<script>
<!-- 冒泡的方法,点击s2,s2先响应click事件,其次是s1 -->
s1.addEventListener("click", function(e) {
console.log("s1 冒泡事件");
}, false);
s2.addEventListener("click", function(e) {
console.log("s2 冒泡事件");
}, false);
</script>
</body> </html>
事件捕获案例:
<!DOCTYPE html>
<html lang="en" dir="ltr"> <head>
<meta charset="utf-8">
<title></title>
</head> <body>
<div id="s1">s1
<div id="s2">s2</div>
</div>
<script>
<!-- 捕捉的方法,点击s2,s1先响应click事件,其次是s2 -->
s1.addEventListener("click", function(e) {
console.log("s1 捕获事件");
}, true);
s2.addEventListener("click", function(e) {
console.log("s2 捕获事件");
}, true);
</script> </html>
二、事件委托
事件委托是指将事件绑定在父元素上,然后采用事件冒泡的方法,当事件流达到父元素时,可以通过target获取真正触发的当前元素,并执行绑定在父元素上的方法。
这样做可以省去一个个给子元素绑定事件。
一般的步骤是:
①确定需要监听时间的父元素,我现在一般需要画出DOM树
②给父元素添加addEventListener('event', function)
③通过父元素.target获取实际被操作的元素,在函数中进行处理
通俗点说,就是先找到一个比较高的公共元素节点,给它绑定事件,然后通过event.target知道是哪个子节点触发了事件,找到了触发节点,就可以对它进行操作(删除它,删除它的父节点等)
【JavaScript】事件捕获、事件冒泡与事件委托的更多相关文章
- DOM事件: DOM事件级别、DOM事件流、DOM事件模型、DOM事件捕获过程、自定义事件
前端面试中只要问到事件,就肯定会有DOM事件:如果回答出来了,就会一直向下延申,其实这些东西都很简单,但我第一次被问到的时候,也是懵的: DOM事件级别: DOM0 element.onclick = ...
- javascript事件捕获与冒泡
对“捕获”和“冒泡”这两个概念,我想我们对冒泡更熟悉一些,因为在我们使用的所有浏览器中,都支持事件冒泡,即事件由子元素向祖先元素传播的,就 像气泡从水底向水面上浮一样.而在像firefox,chrom ...
- JavaScript 事件(捕获和冒泡 兼容性写法)
事件 浏览器客户端上客户触发的行为都称为事件 所有的事件都是天生自带的 不需要人为绑定 只需要我们去触发通过obj.事件名=function(){} 我们给元素的事件绑定了一个方法 事件名:on ...
- 在javascript中的浏览器兼容问题以及兼容浏览器汇总(默认事件,阻止冒泡,事件监听。。。)以及解决方式详解
在javascript中常见的浏览器兼容问题,以及解决方式. 在前端工作当中我们遵循这样的原则:渐进增强和优雅降级 渐进增强(progressive enhancement): 针对低版本浏览器进 ...
- dom事件不求甚解,色解事件捕获和冒泡
以前对事件只会用jq的bind绑定一下,脑海里留着书中的事件循环,一直认为事件就是这儿循环的,最近看园子里的文章,对事件的了解更模糊了 所以我做了个小实验,总结一下看的这些零零碎碎的文章,如果总结错了 ...
- js中addEventListener第三个参数涉及到的事件捕获与冒泡
js中,我们可以给一个dom对象添加监听事件,函数就是 addEventListener("click",function(){},true); 很容易理解,第一个参数是事件类型, ...
- Spirit带你彻底了解事件捕获和冒泡机制
Dom标准事件模型 在Dom标准事件模型中,事件是先进行捕获,达到目标阶段时,在进行冒泡的 捕获阶段==>目标阶段==>冒泡阶段 目标元素和非目标元素 在介绍事件捕获和事件冒泡前 我们先要 ...
- js事件捕获和冒泡解析
<div id="box"> <div id="box2"> <p id="test">test< ...
- javaScript事件机制深入学习(事件冒泡,事件捕获,事件绑定方式,移除事件方式,阻止浏览器默认行为,事件委托,模拟浏览器事件,自定义事件)
前言 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码.这种在传统软 ...
- js:捕获冒泡和事件委托
一.事件流(捕获,冒泡) 事件流:指从页面中接收事件的顺序,有冒泡流和捕获流. 当页面中发生某种事件(比如鼠标点击,鼠标滑过等)时,毫无疑问子元素和父元素都会接收到该事件,可具体顺序是怎样的呢?冒 ...
随机推荐
- Team
队名 正义联盟 团队成员 211606301 蔡振翼(队长) 211606445 肖志豪 211606382 吴文清 211606370 刘华强 211605240 谢孟轩 211614269 林凯 ...
- S0.0 计算机如何看东西
标签(空格分隔):数字图像处理 opencv 当我们用特定软件打开一张图片或者更改某些位图的格式为txt时,就会发现图像的本质不过就是一堆数据罢了. 采样 我们可以用相机采样到一幅二维图像,图像的分辨 ...
- Chapter 4 : Control Structures 1 : Selection
Although it need not be, the expression is usually an identifier. Whether it is an identifieror an e ...
- node.js官方文档解析 02—buffer 缓冲器
Buffer 类的实例类似于整数数组,但 Buffer 的大小是固定的.且在 V8 堆外分配物理内存.Buffer 的大小在被创建时确定,且无法调整. Buffer 类在 Node.js 中是一个全局 ...
- 51nod 1617 奇偶数组
传送门 回来看一眼51nod,发现自己掉到rank4了,赶紧切道题回rank3. 一眼不会做,这种东西应该慢慢找规律吧……然后看到数据范围其实比较小,应该是单次log的,那是不是可以分治啊. #inc ...
- python学习-01
1.编程语言分类: 编译型:(由编译器将代码编译成计算机识别的二进制文件)C \C++ \C# 运行速度较解释型语言快 解释型:(在运行时进行编译)python.php.sheel.ruby.j ...
- Linux下批量修改后缀名
1.用find和xargs添加后缀名 [root@node99 yum.repos.d]# ls -ltr total 32 -rw-r--r--. 1 root root 5701 Nov 23 2 ...
- 解析数学表达式 代码解析AST语法树
2019年2月20日09:18:22 AST语法树自己写代码解析的话就比较麻烦,有现成的库可以解析PHP,就像webpack就是自己解析js的语法代码,编译成各种版本的可用代码 github http ...
- Sublime Text 3 使用心得
1.Ctrl + Shift + P : package control install package == > ConvertToUTF82.列模式: 苹果:OS X -鼠标左键+Optio ...
- Wpf DataGrid 自动滚动到最后一行
if (mainDataGrid.Items.Count > 0) { var border = VisualTreeHelper.GetChild(mainDataGrid, 0) as De ...