JS中的事件委托和事件代理

什么是事件委托?
事件委托还有一个名字叫事件代理,JS高程上讲:事件委托就是利用事件冒泡,只制定一个时间处理程序,就可以管理某一类型的所有事件。我用取快递来解释这个现象: 有三个同事预计会在周一收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台代为签收。现实当中,我们大都采用委托的方案。前台收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款。这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台也会在收到寄给新员工的快递后核实并代为签收。

一、背景介绍

这里其实还有2层意思的:
第一,现在委托前台的同事是可以代为签收的,即程序中的现有的dom节点是有事件的;
第二,新员工也是可以被前台代为签收的,即程序中新添加的dom节点也是有事件的。

二、知识剖析

2.1为什么要用事件委托
在JavaScript中,添加到页面上的事件处理程序数量将直接关系到页面的整体运行性能,因为需要不断的与dom节点进行交互,访问dom的次数越多,引起浏览器重绘与重排的次数也就越多,就会延长整个页面的交互就绪时间,这就是为什么性能优化的主要思想之一就是减少DOM操作的原因;每个函数都是一个对象,是对象就会占用内存,对象越多,内存占用率越大,100个li就要占用100个内存空间。如果要用事件委托,就会将所有的操作放到js程序里面,只对它的父级(如果只有一个父级)这一个对象进行操作,与dom的操作就只需要交互一次,这样就能大大的减少与dom的交互次数,提高性能;
2.2事件委托的原理
事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事件,举个例子:页面上有这么一个节点树,div>ul>li>a;比如给最里面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序a>li>ul>div,有这样一个机制,那么我们给最外面的div加点击事件,那么里面的ul,li,a做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托它们父级代为执行事件。
子节点实现相同的功能:实现功能是点击li,把对应的li的背景色变成红色:

     <ul id="ulall"><li>1111</li><li>2222</li><li>3333</li><li>4444</li></ul><script type="text/javascript">var oUl=document.getElementById('ulall')var aLi=oUl.getElementsByTagName('li')for (let i=0;i<aLi.length;i++){aLi[i].onclick=function(){aLi[i].style.backgroundColor="red"}}

我们看看有多少次的dom操作,首先要找到ul,然后遍历li,然后点击li的时候,又要找一次目标的li的位置,才能执行最后的操作,每次点击都要找一次li;
那么我们用事件委托的方式做又会怎么样呢?

         var oUl=document.getElementById('ulall')var aLi=oUl.getElementsByTagName('li')oUl.onclick=function(e){var e=window.event||evar tar=e.target || e.srcElement     //取得触发事件的元素节点if(tar.nodeName=='LI'){tar.style.backgroundColor='red'}}

这里用父级ul做事件处理,当li被点击时,由于冒泡原理,事件就会冒泡到ul上,因为ul上有点击事件,所以事件就会触发
2.3 事件冒泡及捕获

DOM2.0模型将事件处理流程分为三个阶段:一、事件捕获阶段,二、事件目标阶段,三、事件起泡阶段。如图:

事件捕获:当某个元素触发某个事件(如onclick),顶层对象document就会发出一个事件流,随着DOM树的节点向目标元素节点流去,直到到达事件真正发生的目标元素。在这个过程中,事件相应的监听函数是不会被触发的。 事件目标:当到达目标元素之后,执行目标元素该事件相应的处理函数。如果没有绑定监听函数,那就不执行。 事件起泡:从目标元素开始,往顶层元素传播。途中如果有节点绑定了相应的事件处理函数,这些函数都会被触发。
2.4事件委托的优点
通过刚才的对比介绍,大家应该能够体会到使用事件委托对于web应用程序带来的几个优点: 1.管理的函数变少了。不需要为每个元素都添加监听函数。对于同一个父节点下面类似的子元素,可以通过委托给父元素的监听函数来处理事件。 2.可以方便地动态添加和修改元素,不需要因为元素的改动而修改事件绑定。 3.JavaScript和DOM节点之间的关联变少了,这样也就减少了因循环引用而带来的内存泄漏发生的概率
那么如果是新增的节点,新增的节点会有事件吗?会有的!

js基础-21-事件委托相关推荐

  1. JavaScript系列—简述JS中的事件委托和事件代理

    JS中的事件委托和事件代理 什么是事件委托? 事件委托还有一个名字叫事件代理,JS高程上讲:事件委托就是利用事件冒泡,只制定一个时间处理程序,就可以管理某一类型的所有事件.我用取快递来解释这个现象: ...

  2. js中的事件委托或是事件代理详解(转载)

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  3. JS中的事件委托/事件代理详解

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  4. JS中的事件委托 / 代理详解

    [前言] 事件委托/代理是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的 [主体] 概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用 ...

  5. js中的事件委托或是事件代理详解

    参考文章:https://www.cnblogs.com/liugang-vip/p/5616484.html 概述 事件委托也叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒 ...

  6. 深入理解js中的事件委托

    事件委托是前端面试的经典面试题型,上次面试给我整的一脸懵逼,好尴尬.准备找工作的小伙伴赶紧学习学习,也许会对你有帮助. 事件委托原理 事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类 ...

  7. JS 中的事件委托是什么?

    大家好,我是前端西瓜哥.今天我们来认识一下事件委托. 所谓事件委托,就是将原本应该在当前元素绑定的事件,放到它的祖先元素上,让祖先元素来委托处理. 事件流 事件流指从页面中接收事件的顺序,也可理解为事 ...

  8. web js基础3 事件

    文章目录 概述 事件类型 事件句柄 事件句柄表 事件处理(三种处理方式) 静态指定 动态指定 特定对象的特定事件指定 事件处理程序的返回值 案例 表单事件 Form 获得及失去焦点 提交及重置 改变及 ...

  9. 【js基础】事件对象

    1.什么是事件对象 官方解释:event 对象代表事件的状态,比如键盘按键的状态.鼠标的位置.鼠标按钮的状态等. 简单理解:事件发生后,跟事件有关的一系列信息数据的集合都放到整个对象里面,这个对象就是 ...

  10. click事件在什么时候出发_超全的js事件机制amp;事件委托

    超全的js事件机制&事件委托,想要理解js事件只需认真看完此篇即可~ 目录结构: 什么是事件机制 事件冒泡事件捕获 DOM事件流事件委托 误区 在同一个对象上注册事件,并不一定按照注册顺序执行 ...

最新文章

  1. 16 系统测试之功能测试
  2. SQL Server 索引结构及其使用(二)
  3. dede调用当前顶级栏目名称、ID、url方法
  4. python读取大文件目录_65.Python读取大文件
  5. hdu1247(Hat’s Words)
  6. 区块如何防篡改_深入浅出:一条数据是如何完成上链的
  7. MapReduce实现词频统计
  8. cross-validation:从 holdout validation 到 k-fold validation
  9. Duplicate entry 'xxx' for key 'xxx'
  10. 【习题 8-10 UVA - 1614】Hell on the Markets
  11. iphone 添加网易邮箱(126/163)踩坑(ios16)
  12. Dex.top“50计划”新玩法,能否让行业格局重新洗牌?
  13. Html 和 CSS笔记
  14. C/C++函数注释格式
  15. Chrome安装插件Save All Resources
  16. 知识图谱嵌入的Translate模型汇总(TransE,TransH,TransR,TransD)
  17. 全国各区县经纬度查询困难?精度不够?试试自制市区县经纬度查询工具并将数据保存本地
  18. 算法学习笔记2:凸包及其解法
  19. easywechat5发送模板消息
  20. CainAbel工具的下载和使用

热门文章

  1. Octave GNU默认配置文件位置
  2. 生产环境服务器部署kvm虚拟化6,KVM虚拟化平台环境部署
  3. python 链接spark_Spark大数据分布式处理实战:一文带你走进大数据世界
  4. mysql 存储引擎文件夹_4种常用MySQL存储引擎
  5. C# System.Drawing.SystemColors 系统颜色
  6. 关于中缀表达式的计算 和算符优先算法
  7. Shiro权限控制框架
  8. java12 - 7 排序的案例
  9. LeetCode:81. Search in Rotated Sorted Array II
  10. 查询工商单位注册信息 平台