一、前言

  说实话,真问我什么是事件委托,我肯定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级事件)的更多相关文章

  1. dom0级事件和dom2级事件

    dom0级事件 <a href="#" id="hash" onclick="fn();fn1();"> <button ...

  2. 测试DOM0级事件和DOM2级事件的堆叠

    1. 问题 如果大家看过北风网CJ讲师的Javascript视频教程,就可以看到其封装了一个很强的事件添加和删除函数,如下所示 function addEvent(obj, evtype, fn) { ...

  3. DOM0、DOM2级事件

    JavaScript DOM0.DOM2级事件 1.DOM0级事件:on+事件类型 在html行内直接绑定,也就是通过行内js绑定的例如<span onclick="alert('1' ...

  4. 关于DOM事件流、DOM0级事件与DOM2级事件

    一.DOM 事件模型 DOM 事件模型包括捕获和冒泡,捕获是从上往下到达目标元素,冒泡是从当前元素,也就是目标元素往上到 window 二.流 流的概念,在现今的 JavaScript 中随处可见.比 ...

  5. DOM1级问题与DOM2级事件

    前几天有小伙伴问过我一个问题,为什么有DOM 0级事件以及DOM2级事件,但是却没有DOM1级事件呢?那我们今天就来说一说DOM的级别问题. 同时推荐伙伴们可以看看尚学堂有关JavaScript BO ...

  6. 【20190226】JavaScript-知识点记录:dom0级事件,dom2级事件

    DOM0级事件处理程序: 通过将元素的事件处理程序属性(如onclick)的值设置为一个函数来指定事件处理程序的方法称为DOM0级方法,它被认为是元素的方法,这时候的事件处理程序是在元素的作用域中运行 ...

  7. 关于DOM2级事件的事件捕获和事件冒泡

    DOM2级事件中addEventListener的执行机制,多个addEventListener同时添加时的执行先后规律: W3C的DOM事件触发分为三个阶段:①.事件捕获阶段,即由最顶层元素(一般是 ...

  8. 2015-03-12——简析DOM2级事件

    DOM2级事件 事件的几种类型:对象事件,鼠标事件,键盘事件,表单事件,W3CDOM事件,以及针对浏览器的事件. 对象事件:window对象,也是javascript对象.load  适用于windo ...

  9. 事件流程以及dom2级事件绑定

    事件流程分为三个阶段:捕获阶段.目标阶段.冒泡阶段. 捕获阶段:事件从最顶层元素开始执行,一层层往下,直到精确元素. 目标阶段:事件在精确元素上执行. 冒泡阶段:事件从精确元素开始执行,一层层往上,直 ...

随机推荐

  1. 解释ARP协议和RARP协议

    解释ARP(地址解析协议) 首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系. 当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主 ...

  2. ResourceBundle读取配置文件

    import java.util.ResourceBundle; /** * Created by win7 on 2017/5/20. */public class Test1 { public s ...

  3. linux firewall

    一.查看防火墙状态1.首先查看防火墙是否开启,如未开启,需要先开启防火墙并作开机自启 systemctl status firewalld 开启防火墙并设置开机自启 systemctl start f ...

  4. jmeter 参数化2_CSV Data Set Config

    CSV Data Set Config:适用于参数取值范围较大的时候使用,该方法具有更大的灵活性 操作路径:HTTP取样器-->Add-->Config Element-->CSV ...

  5. python-zmail发送邮件

    import zmail #发送测试报告到邮件 with open(r'F:\asus\auto_file\unittest_html\2019-06-30 10-31-03report.html', ...

  6. 前端每日实战:63# 视频演示如何用纯 CSS 创作一台烤面包机

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OEBJRN 可交互视频 此视频是可 ...

  7. setInterval,setTimeout,clearInterval

    定时器 var i=0; function iadd(){ i++; console.log(i) } setInterval(iadd,1000);//1.2.3... 超时调用 var i=0; ...

  8. java基础复习(二)

    一. 基本语法 如果一个源文件中什么内容都没有,编译会不会生成 字节码文件?不会 如果一个类中没有主方法(如下图),编译运行会怎么样?编译可以通过,但运行报错 : 没有主方法 主方法 : 是一个特殊的 ...

  9. pgsql SQL监控,查询SQL执行情况

    SELECT procpid, START, now() - START AS lap, current_query FROM ( SELECT backendid, pg_stat_get_back ...

  10. sql2008质疑处理方法

    日常对Sql Server 2005关系数据库进行操作时,有时对数据库(如:Sharepoint网站配置数据库名Sharepoint_Config)进行些不正常操作如数据库在读写时而无故停止数据库,从 ...