JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。那这是什么意思呢?事件委托到底是一个什么原理:

有三个同事预计会在同一天收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台代为签收。现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递)。前台收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收。

这里其实还有2层意思的:

第一,现在委托前台的同事是可以代为签收的,即程序中的现有的dom节点是有事件的;

第二,新员工也是可以被前台代为签收的,即程序中新添加的dom节点也是有事件的。

为什么要用事件委托:

一般来说,dom需要有事件处理程序,我们都会直接给它设事件处理程序就好了,那如果是很多的dom需要添加事件处理呢?比如我们有100个li,每个li都有相同的click点击事件,可能我们会用for循环的方法,来遍历所有的li,然后给它们添加事件,那这么做会存在什么影响呢?

在JavaScript中,添加到页面上的事件处理程序数量将直接关系到页面的整体运行性能,因为需要不断的与dom节点进行交互,访问dom的次数越多,引起浏览器重绘与重排的次数也就越多,就会延长整个页面的交互就绪时间,这就是为什么性能优化的主要思想之一就是减少DOM操作的原因;如果要用事件委托,就会将所有的操作放到js程序里面,与dom的操作就只需要交互一次,这样就能大大的减少与dom的交互次数,提高性能;

每个函数都是一个对象,是对象就会占用内存,对象越多,内存占用率就越大,自然性能就越差了(内存不够用,是硬伤,哈哈),比如上面的100个li,就要占用100个内存空间,如果是1000个,10000个呢,那只能说呵呵了,如果用事件委托,那么我们就可以只对它的父级(如果只有一个父级)这一个对象进行操作,这样我们就需要一个内存空间就够了,是不是省了很多,自然性能就会更好。

事件委托的原理:

事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事件,举个例子:页面上有这么一个节点树,div>ul>li>a;比如给最里面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序a>li>ul>div,有这样一个机制,那么我们给最外面的div加点击事件,那么里面的ul,li,a做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托它们父级代为执行事件。

子节点实现相同的功能:实现功能是点击li,弹出李清照三个字。

上面为普通的写法

首先要找到ul,然后遍历li,然后点击li的时候,又要找一次目标的li的位置,才能执行最后的操作,每次点击都要找一次li;

那么我们用事件委托的方式做又会怎么样呢?

上面为事件代理的写法

这里用父级ul做事件处理,当li被点击时,由于冒泡原理,事件就会冒泡到ul上,因为ul上有点击事件,所以事件就会触发,当然,这里当点击ul的时候,也是会触发的,那么问题就来了,如果我想让事件代理的效果跟直接给节点的事件效果一样怎么办,比如说只有点击li才会触发。

Event对象提供了一个属性叫target,可以返回事件的目标节点,我们成为事件源,也就是说,target就可以表示为当前的事件操作的dom,但是不是真正操作dom,当然,这个是有兼容性的,标准浏览器用ev.target,IE浏览器用event.srcElement,此时只是获取了当前节点的位置,并不知道是什么节点名称,这里我们用nodeName来获取具体是什么标签名,这个返回的是一个大写的,我们需要转成小写再做比较(习惯问题):

事件委托,操作同样的效果

前面所讲的都是document加载完成的现有dom节点下的操作,那么如果是新增的节点,新增的节点会有事件吗?

实现一个这样的功能:现在是移入li,li变红,移出li,li变白,这么一个效果,然后点击按钮,可以向ul中添加一个li子节点

新增节点也有样式效果(一般写法)

下面看下用时间委托的写法:

事件委托的写法

上面是用事件委托的方式,新添加的子元素是带有事件效果的,我们可以发现,当用事件委托的时候,根本就不需要去遍历元素的子节点,只需要给父级元素添加事件就好了,其他的都是在js里面的执行,这样可以大大的减少dom操作,这才是事件委托的精髓所在。

js 事件委托深入浅出相关推荐

  1. js事件委托和事件冒泡

    js事件委托基本原理: 将子元素的事件委托给父元素来处理 就算父级下面暂时还没有子元素 待到子元素节点出来后一样可以触发事件 如果要删除ul下面的每个li,点击li即可删除 传统做法: 循环给每个li ...

  2. js事件委托(事件代理)的原理以及优缺点

    js事件委托/事件代理的原理以及优缺点 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上 ...

  3. JS事件委托或者事件代理原理以及实现

    事件委托(事件代理)原理:简单的说就是将事件交由别人来执行,就是将子元素的事件通过冒泡的形式交由父元素来执行. 为什么要用时间委托? 在JavaScript中,添加到页面上的事件处理程序数量将直接关系 ...

  4. JS事件委托的概念和作用

    一.写在前头 接到某厂电话问什么是事件代理的时候,一开始说addEventListener,然后他说直接绑定新的元素不会报dom不存在的错误吗?然后我就混乱了,我印象中这个方法是可以绑定新节点的.后面 ...

  5. js事件委托或事件代理

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

  6. JS事件详解和js事件委托

    简述事件 事件起始于IE3,作为一种分担服务器运算负载的一种手段.用于键盘.鼠标等工具对于网页的交互!事件对于不同浏览器来说,有不同的标准,尤其是IE.Chrome两大巨头浏览器上,虽然现如今Chro ...

  7. js事件委托(事件代理)

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

  8. JS事件委托(什么情况下使用事件委托)

    1. 什么是事件委托 事件委托:把事情委托给别人,代为处理. 事件委托也称为事件代理,在 jQuery 里面称为事件委派. 理解:说白了就是,不给子元素注册事件,给父元素注册事件,把处理代码在父元素的 ...

  9. js事件委托和jQuery事件绑定on , off , one , bind , unbind , die

    一. 事件委托 什么是事件委托?用现实中的理解就是:有100 个学生同时在某天中午收到快递,但这 100 个学生不可能同时站在学校门口等,那么都会委托门卫去收取,然后再逐个交给学生. 而在jQuery ...

最新文章

  1. 像我这种垃圾学校出来的人...【原话,不是我编的】
  2. SA区坏道数据恢复的经历
  3. DELL R740XD 开启 TPM功能
  4. (github标星9200+)《南瓜书》:周志华《机器学习》的代码实现
  5. P3225 [HNOI2012]矿场搭建 割点 tarjan 双联通分量
  6. 自制H3C交换机CONSOLE线
  7. TypeScript 3.9 正式发布!平均编译时长从 26 秒缩短至 10 秒
  8. 在Windows XP下,安装VS 2010 Express For Windows Phone .
  9. Cmake编译 OPENCV_DNN_CUDA 报错: CMake Error at modules/dnn/CMakeLists.txt:39 (message):
  10. TBODY的使用方法和意义
  11. 一键清理系统垃圾文件bat
  12. webpack打包提示: The following entrypoint(s) combined asset size exceeds the recommended limit
  13. 一、线性模型----Lasso、Ridge回归及正则化的初步理解
  14. 经典布局(flex和传统两种实现)—左中右三栏式
  15. Pascal triangle 帕斯卡三角形 杨辉三角形 二项式定理
  16. java使用poi给excel文件插入数据
  17. 在S3C6410开发板上的LED驱动程序
  18. 功能测试与非功能测试
  19. 游戏开发中——垂直同步、绘制效率、显示器刷新频率与帧率
  20. 统一用户权限管理系统(正式版)

热门文章

  1. java图像处理之图像融合
  2. 使用LAMP创建基于wordpress的个从博客网站
  3. python学习笔记(十四)标准库urllib
  4. 深入互联网广告中的出价模式(中) — 智能出价模式
  5. 【从传统方法到深度学习】图像分类
  6. 机器学习手动撸代码系列3-感知机
  7. docker安装zookeeper(单节点安装)
  8. Nginx-基础使用
  9. 枚举当前环境中打开的所有IE
  10. 基于指定文本的百度地图poi城市检索的使用(思路最重要)