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级事件绑定
事件流程分为三个阶段:捕获阶段.目标阶段.冒泡阶段. 捕获阶段:事件从最顶层元素开始执行,一层层往下,直到精确元素. 目标阶段:事件在精确元素上执行. 冒泡阶段:事件从精确元素开始执行,一层层往上,直 ...
随机推荐
- Linux就该这么学11学习笔记
参考链接:https://i.cnblogs.com/EditPosts.aspx?opt=1 文件传输协议 一般来讲,人们将计算机联网的首要目的就是获取资料,而文件传输是一种非常重要的获取资料的方式 ...
- python类中方法__str__()和__repr__()简单粗暴总结
在交互式模式下,类中同时实现__str__()和__repr__()方法: 直接输入实例名称显示repr返回的类容: 用print打印实例名称显示str返回的内容: >>> clas ...
- (ACM模板)映射map
#include<iostream> #include<cstdio> #include<map> using namespace std; int main() ...
- htmlunit填坑
htmlunit 无头浏览器 爬虫使用填坑: <!-- htmlunit start --> <dependency> <groupId>org.jsoup< ...
- linux清除文件内容
#以下方式清空文件大小为0 cat /dev/null > catalina.out清除日志文件 $ : > filename $ > filename #以下方式清空文件大小为1 ...
- struts2的作用是什么
struts2是一种重量级的框架,位于MVC架构中的controller,可以分析出来,它是用于接受页面信息然后通过内部处理,将结果返回. 同时struts2也是一个web层的MVC框架,那么什么是s ...
- nyoj 83:迷宫寻宝(二)(计算几何)
题目链接 枚举所有墙的2n个端点与宝物的位置作为一条线段(墙的端点必定与边界重合), 求出与之相交的最少线段数(判断线段相交时用跨立实验的方法),+1即为结果. #include<bits/st ...
- WORM Worm worm 毛毛虫爬树爬树~
对于动态规划,我也就不多说了.因为还不会, 每个题都不一样,但大致原则是一样的.抓住题意, 本题:n棵树,毛毛虫在m分钟内从p到t的路线种数,毛毛虫只可以向左右相邻位置走. 中心代码: for(i = ...
- BUUCTF | [CISCN2019 华北赛区 Day2 Web1]Hack World
id=0 id=1 id=2 id=3 发现结果不一样,尝试 : ">4","=4","<4" : 在自己的环境下验证一下: 爆 ...
- [CSP-S模拟测试]:蔬菜(二维莫队)
题目描述 小$C$在家中开垦了一块菜地,可以抽象成一个$r\times c$大小的矩形区域,菜地的每个位置都种着一种蔬菜.秋天到了,小$C$家的菜地丰收了. 小$C$拟定了$q$种采摘蔬菜的计划,计划 ...