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 事件与事件委托的更多相关文章

  1. DOM事件机制(事件捕获和事件冒泡和事件委托)

    内容: 1.事件复习 2.事件冒泡与事件捕获 3.事件委托 1.事件复习 (1)事件 事件是用来处理响应的一个机制,这个响应可以来自于用户(点击, 鼠标移动, 滚动), 也可以来自于浏览器 下面的链接 ...

  2. DOM 事件机制&事件委托

    一.事件机制 事件是在编程时系统内发生的动作或者发生的事情,系统会在事件出现的时候触发某种信号并且会提供一个自动加载某种动作的机制(来自MDN).每个事件都有事件处理器(有时也叫事件监听器),也就是触 ...

  3. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  4. jQuery事件绑定和委托

    可以用多种方法实现,on()  . bind()  . live()  . delegate() ,还有one(). 有时我们可能会像下面这样绑定一个事件: $("#div1"). ...

  5. JS中事件代理与委托

    在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么 ...

  6. JQ 为未来元素添加事件处理器—事件委托

    随着DOM结构的复杂化和Ajax等动态脚本技术的运用,有了较多的动态添加进来的元素,直接用JQ添加click事件会发现新添加进来的元素并不能直接选取到,在这里就需要用到事件委托方法,JQ为事件委托提供 ...

  7. [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流

    面试题 event 事件 事件委托是什么? 如何阻止事件冒泡,阻止默认事件呢? Javascript 的事件流模型都有什么? 事件绑定和普通事件有什么区别? Event 对象 Event 对象,当事件 ...

  8. JavaScript事件代理和委托

    在javasript中,代理.委托经常出现. 那么它究竟在什么样的情况下使用?它的原理又是什么? 这里介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中de ...

  9. 理解js事件冒泡事件委托事件捕获

    js事件冒泡 javascript的事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览器可能到window为止,这就是事件冒泡现象. <di ...

随机推荐

  1. ESD@TVS选型

    一.工作原理 ESD ESD静电保护元件,又称静电抑制二极管.ESD是多个TVS晶粒或二极管采用不同的布局做成具有特定功能的多路或单路ESD保护器件,主要应用于各类通信接口静电保护,如USB.HDMI ...

  2. CSS学习(二):背景图片如何定位?

    我们都知道background-position属性用来指定背景图片应该出现的位置,可以使用关键字.绝对值和相对值进行指定.在CSS Sprites中,这个属性使用比较频繁,使用过程中,我常混淆,经常 ...

  3. 【转自百度fex】fex-team/interview-questions

    fex-team/interview-questions 注意 目前发现有其他人以 FEX 团队名义进行招聘,发出的邮箱皆为私人邮箱. 为防止在投递简历出现误会,在此提醒各位注意: FEX 团队没有以 ...

  4. Codepen 每日精选(2018-3-31)

    按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以打开原始页面. 制作像素画的画板https://codepen.io/abeatrize/... 纯 css 画的晚上的风 ...

  5. java中如何能把一个字符串转成日期对象

    题目3.1: 把一个字符串转成日期对象 当我们想根据输入字符串得到一个日期对象时我们不知道,应该以什么格式写这个字符串,才能被系统正确解析,一种聪明的做法是,马克-to-win,我们先 把日期对象根据 ...

  6. 手写封装防抖debounce

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. sourceCRT设置全局字符集为utf-8

    以前刚打开服务器crt字符集都会默认是default模式,搞得每次都要手动设置成UTF-8. 烦躁. 将CRT全局字符集设置成UTF-8格式方法: 设置窗口不会断掉: 即每100s发送一次ls \n ...

  8. Rb(redis blaster),一个为 redis 实现 non-replicated 分片的 python 库

    Rb,redis blaster,是一个为 redis 实现非复制分片(non-replicated sharding)的库.它在 python redis 之上实现了一个自定义路由系统,允许您自动定 ...

  9. 帝国cms 列表页或文章页取当前栏目链接

    获取当前栏目链接 : <?=sys_ReturnBqClassUrl($class_r[$GLOBALS[navclassid]]);?>获取当前栏目名称 :[!--class.name- ...

  10. java四种访问修饰符及各自的权限

    1.public,即共有的,是访问权限限制最宽的修饰符.被public修饰的类.属性.及方法不仅可以跨类访问,而且可以跨包访问. 2. protected,即保护访问权限,是介于public和priv ...