JS事件委托(事件代理,dom2级事件)
一、前言
说实话,真问我什么是事件委托,我肯定gg,还好查了一下,原来就是我之前练习过的DOM2级事件的应用。
二、什么是事件委托?
事件委托就是当事件触发时,把要做的事委托给父元素(或父元素的父元素)来处理。也就是:利用冒泡的原理,把事件加到父级上,通过判断事件来源的子集,执行相应的操作。使用事件委托技术能让你避免对特定的每个节点添加事件监听器。
三、事件委托作用
1.减少事件注册,节省内存
-table可以代理所有td的click事件
-ul可以代理所有li的click事件
2.能为之后新增的DOM元素自动添加事件(事件委托给了父级,只要是子级,就能代理)
-新增的li不用绑定事件
-删除li时,不需要解绑
案例演示:
场景1:当多个li标签需要添加 mouseover 变色时
效果如下图:

ul{
width: 200px;
line-height: 30px;
}
li.checked{
background-color: aqua;
}
<h2>去哪儿开房?</h2>
<ul>
<li>你家</li>
<li>我家</li>
<li>如家</li>
</ul>
不用事件委托需要遍历添加事件
window.onload = function(){
let oLi = document.getElementsByTagName('li');
for(let i=0,len=oLi.length;i<len;i++){ // 遍历所有li
oLi[i].onmouseover = function () {
this.classList.add('checked')
}
oLi[i].onmouseout = function () {
this.classList.remove('checked')
}
}
}
使用事件委托
window.onload = function(){
let oUl = document.getElementsByTagName('ul')[0]; //事件委托给li的父级
function beenChecked(e) { //e是event事件
e.target.classList.add('checked') //e.target是事件源
}
function notChecked(e) {
e.target.classList.remove('checked')
}
oUl.addEventListener('mouseover',beenChecked) // 第三参数默认false,事件冒泡
oUl.addEventListener('mouseout',notChecked)
}
场景2:新增的li标签,自动添加该事件

<button id="btn">新增一条li</button>
<h2>去哪儿开房?</h2>
<ul>
<li>你家</li>
<li>我家</li>
<li>如家</li>
</ul> <script>
window.onload = function(){
let btn = document.getElementById('btn')
let oUl = document.getElementsByTagName('ul')[0];
btn.onclick=function () {
let oLi = document.createElement('li');
oLi.innerHTML = '全家'
oUl.appendChild(oLi); //新增li
}
function beenChecked(e) {
e.target.classList.add('checked')
}
function notChecked(e) {
e.target.classList.remove('checked')
}
oUl.addEventListener('mouseover',beenChecked) // 默认事件冒泡
oUl.addEventListener('mouseout',notChecked)
}
</script>
四、缺点
1.事件的委托基于冒泡,对于onfocus和onblur事件不支持。
2.层级过多,冒泡过程中,可能会被某层阻止掉(建议就近委托)
只要事件不支持冒泡或者途中有 event.stopPropagation() 等,那么委托就会失败,所以并不适用直接在document上进行委托。
JS事件委托(事件代理,dom2级事件)的更多相关文章
- dom0级事件和dom2级事件
dom0级事件 <a href="#" id="hash" onclick="fn();fn1();"> <button ...
- 测试DOM0级事件和DOM2级事件的堆叠
1. 问题 如果大家看过北风网CJ讲师的Javascript视频教程,就可以看到其封装了一个很强的事件添加和删除函数,如下所示 function addEvent(obj, evtype, fn) { ...
- DOM0、DOM2级事件
JavaScript DOM0.DOM2级事件 1.DOM0级事件:on+事件类型 在html行内直接绑定,也就是通过行内js绑定的例如<span onclick="alert('1' ...
- 关于DOM事件流、DOM0级事件与DOM2级事件
一.DOM 事件模型 DOM 事件模型包括捕获和冒泡,捕获是从上往下到达目标元素,冒泡是从当前元素,也就是目标元素往上到 window 二.流 流的概念,在现今的 JavaScript 中随处可见.比 ...
- DOM1级问题与DOM2级事件
前几天有小伙伴问过我一个问题,为什么有DOM 0级事件以及DOM2级事件,但是却没有DOM1级事件呢?那我们今天就来说一说DOM的级别问题. 同时推荐伙伴们可以看看尚学堂有关JavaScript BO ...
- 【20190226】JavaScript-知识点记录:dom0级事件,dom2级事件
DOM0级事件处理程序: 通过将元素的事件处理程序属性(如onclick)的值设置为一个函数来指定事件处理程序的方法称为DOM0级方法,它被认为是元素的方法,这时候的事件处理程序是在元素的作用域中运行 ...
- 关于DOM2级事件的事件捕获和事件冒泡
DOM2级事件中addEventListener的执行机制,多个addEventListener同时添加时的执行先后规律: W3C的DOM事件触发分为三个阶段:①.事件捕获阶段,即由最顶层元素(一般是 ...
- 2015-03-12——简析DOM2级事件
DOM2级事件 事件的几种类型:对象事件,鼠标事件,键盘事件,表单事件,W3CDOM事件,以及针对浏览器的事件. 对象事件:window对象,也是javascript对象.load 适用于windo ...
- 事件流程以及dom2级事件绑定
事件流程分为三个阶段:捕获阶段.目标阶段.冒泡阶段. 捕获阶段:事件从最顶层元素开始执行,一层层往下,直到精确元素. 目标阶段:事件在精确元素上执行. 冒泡阶段:事件从精确元素开始执行,一层层往上,直 ...
随机推荐
- rpmbuild - 构建 RPM 打包
SYNOPSIS 构建打包: rpmbuild {-ba|-bb|-bp|-bc|-bi|-bl|-bs} [rpmbuild-options] SPECFILE ... rpmbuild {-ta| ...
- (转载)python判断一个字符串是否是小数
转载自:牛牛杂货铺 最近在写代码的时候,发现一个问题,想判断一个字符串是不是一个合法的小数,发现字符串没有内置判断小数的方法,然后就写了一个判断字符串是否是小数,可以判断正负小数,代码如下: def ...
- springBoot相关(二)
Spring Boot 三大特性: 组件自动装配:Web MVC .Web Flux .JDBC等 嵌入式Web容器:Tomcat.Jetty以及Undertow 生产准备特性:指标.健康检查.外部化 ...
- struts2的作用是什么
struts2是一种重量级的框架,位于MVC架构中的controller,可以分析出来,它是用于接受页面信息然后通过内部处理,将结果返回. 同时struts2也是一个web层的MVC框架,那么什么是s ...
- @PostMapping
@PostMapping映射一个POST请求 Spring MVC新特性 提供了对Restful风格的支持 @GetMapping,处理get请求 @PostMapping,处理post请求 @Put ...
- 百度小程序-map组件定位
给客户开发一个百度小程序,有个地图定位显示.百度小程序内置的api地图是不准的,通过百度一下,查询到坐标偏移算法公式,自己项目中使用,手机测试坐标已经正常显示! 经纬度,通过百度坐标拾取器拾取到! . ...
- .NET Core 通过 Ef Core 操作 Mysql
1.运行环境 开发工具:Visual Studio 2017 JDK版本:.NET Core 2.0 项目管理工具:nuget 2.GITHUB地址 https://github.com/nbfujx ...
- 前端自动化-gulp入门
前不久本人写了一篇关于gulp安装和配置的文章,其实当时还是懵逼的状态,但是今天再次温习了一遍,感觉对整个流程有个整体的理解了,下面以一个实例给大家分享下我的经验供参考和学习. 1.首先安装nodej ...
- 2019 牛客暑期多校 第三场 F Planting Trees (单调队列+尺取)
题目:https://ac.nowcoder.com/acm/contest/883/F 题意:求一个矩阵最大面积,这个矩阵的要求是矩阵内最小值与最大值差值<=m 思路:首先我们仔细观察范围,我 ...
- react教程 — 性能优化
参考:https://segmentfault.com/a/1190000007811296?utm_medium=referral&utm_source=tuicool 或 https: ...