DOM 事件与事件委托
DOM 事件与事件委托
本文写于 2020 年 5 月 28 日
先思考一个问题:我们如何给一百个 button 添加点击事件?
遍历?
那岂不是要添加一百个监听器?
这就需要事件委托了。
其实这根本不是一个很难的概念,看下去,本文并不长。
1. 点击事件
现在我们拥有三个元素,他们嵌套成为爷爷、爸爸、儿子:
<div class='grandpa'>
<div class='father'>
<div class='son'></div>
</div>
</div>
然后分别给他们仨添加不同的三个事件监听。
因为事件冒泡,我们能知道他们都会执行,并且会按照一定顺序执行。
但是不同浏览器的顺序是不一样的。
IE 认为应该调用 .son 的事件,网景认为应该调用 .grandpa。
后来 2002 年,W3C 发布了标准:
- 先按照从外向内——事件捕获;
- 在按照从内向外——事件冒泡。
整个过程就是——有监听函数就调用,没有就跳过。
开发者可以自己选择把最外层的事件,放在捕获阶段还是冒泡阶段。
如何选择呢?其实就是我们最熟悉的addEventListener。
我们经常会用它去绑定事件,我们一般都只会传入两个参数。
可实际上这个函数有 3 个参数。
我们可以在第三个参数,放置一个布尔值,例如:xxx.addEventListener('click', fn, bool)
如果是true,则是捕获方式(从外向内);如果不写,或者是falsy值,则是冒泡(从内向外)。
顺序问题
上面说了,先捕获后冒泡。
那我同时给一个元素,先挂一个冒泡,再挂一个捕获——谁先触发?
谁先写,谁先触发,因为他们是同级的!
可以取消吗?
捕获不可以取消,但是冒泡可以取消。(有些事件不能取消,比如滚动事件)
e.stopPropagation()中断冒泡。
2. 事件委托
回到我们刚开始的问题:我们如何给一百个 button 添加点击事件?
肯定不是遍历。
我们可以直接给父元素添加事件,例如:
father.addEventListener('click', e => {
console.log(e.target)
console.log(e.currentTarget)
})
这里看到,我们传入了一个 e,这个 e 可以尝试打印出来,就会发现其实是MouseEvent。
这是一个对象,里面有各种各样的数据,比如我们需要的target。
target就是用户所点击的元素!
也就是说如果 father 有 10 个孩子,从 child1 一直到 child10,我们点谁,这个 target 就是谁。
而e.currentTarget呢,和e.target是有区别的!
简单来说呢 target 是被操作的元素,currentTarget 是被监听的元素。
在这个例子中,currentTarget 恒为 father,target 则会随着点击发生改变。
最后说一下,JS 其实是不支持事件的!支持事件的是浏览器,addEventListener 是浏览器的 DOM 提供的。
(完)
DOM 事件与事件委托的更多相关文章
- DOM事件机制(事件捕获和事件冒泡和事件委托)
内容: 1.事件复习 2.事件冒泡与事件捕获 3.事件委托 1.事件复习 (1)事件 事件是用来处理响应的一个机制,这个响应可以来自于用户(点击, 鼠标移动, 滚动), 也可以来自于浏览器 下面的链接 ...
- DOM 事件机制&事件委托
一.事件机制 事件是在编程时系统内发生的动作或者发生的事情,系统会在事件出现的时候触发某种信号并且会提供一个自动加载某种动作的机制(来自MDN).每个事件都有事件处理器(有时也叫事件监听器),也就是触 ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- jQuery事件绑定和委托
可以用多种方法实现,on() . bind() . live() . delegate() ,还有one(). 有时我们可能会像下面这样绑定一个事件: $("#div1"). ...
- JS中事件代理与委托
在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么 ...
- JQ 为未来元素添加事件处理器—事件委托
随着DOM结构的复杂化和Ajax等动态脚本技术的运用,有了较多的动态添加进来的元素,直接用JQ添加click事件会发现新添加进来的元素并不能直接选取到,在这里就需要用到事件委托方法,JQ为事件委托提供 ...
- [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流
面试题 event 事件 事件委托是什么? 如何阻止事件冒泡,阻止默认事件呢? Javascript 的事件流模型都有什么? 事件绑定和普通事件有什么区别? Event 对象 Event 对象,当事件 ...
- JavaScript事件代理和委托
在javasript中,代理.委托经常出现. 那么它究竟在什么样的情况下使用?它的原理又是什么? 这里介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中de ...
- 理解js事件冒泡事件委托事件捕获
js事件冒泡 javascript的事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览器可能到window为止,这就是事件冒泡现象. <di ...
随机推荐
- WebSQL是HTML 5规范的一部分吗?
不是,虽然很多人将其标记为HTML 5,但它不是HTML 5规范的一部分.HTML 5规范基于SQLite.
- HMS Core定位服务在生活服务类App中可以自动填写收货地址啦
在涉及团购.外卖.快递.家政.物流.搬家等生活服务类的App.小程序中,填写收货地址是用户高频使用的功能.这一功能通常采取让用户手动填写的解决方案,例如上下拉动选择浙江省-->杭州市--> ...
- '\ddd'转义字符与八进制转换
所有的ASCII码都可以用"\"加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等, ...
- logback日志级别动态切换的终极方案(asm使用)
背景 一切皆有因果,所有事情,都有事件驱动.本方案的日志级别切换是由这样的背景下产生的: 单个生产环境上,有几百近千个微服务 日志级别切换不重启服务,要求即时生效果 由业务开发人员去修改代码或增加相关 ...
- 从路由原理出发,深入阅读理解react-router 4.0的源码
react-router等前端路由的原理大致相同,可以实现无刷新的条件下切换显示不同的页面.路由的本质就是页面的URL发生改变时,页面的显示结果可以根据URL的变化而变化,但是页面不会刷新.通过前 ...
- 前端面试题整理——关于EventLoop(1)
下面代码输出打印值顺序: async function async1(){ console.log('async1 start'); await async2(); console.log('asyn ...
- [ Perl ] 对文本文件进行行列翻转
https://www.cnblogs.com/yeungchie/ code #!/usr/bin/env perl #----------------------------- # Program ...
- XShell免费版的安装配置教程以及使用教程(超级详细)
一. XShell的作用 XShell可以在Windows界面下来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的.它支持 RLOGIN.SFTP.SERIAL.TELNET.SSH2 ...
- python---二叉树广度优先和深度优先遍历的实现
class Node(object): """结点""" def __init__(self, data): self.data = dat ...
- nmtui 工具使用的话,需要开启NetworkManager(网卡文件不存在ens192)
环境采样: [root@k3master network-scripts]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) ...