JavaScript 事件委托详解

基本概念

事件委托,通俗地来讲,就是把一个元素响应事件(click、keydown......)的函数委托到另一个元素;

一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应到需要绑定的元素上时,会通过事件冒泡机制从而触发它的外层元素的绑定事件上,然后在外层元素上去执行函数。

举个例子,比如一个宿舍的同学同时快递到了,一种方法就是他们都傻傻地一个个去领取,还有一种方法就是把这件事情委托给宿舍长,让一个人出去拿好所有快递,然后再根据收件人一一分发给每个宿舍同学;

在这里,取快递就是一个事件,每个同学指的是需要响应事件的 DOM 元素,而出去统一领取快递的宿舍长就是代理的元素,所以真正绑定事件的是这个元素,按照收件人分发快递的过程就是在事件执行中,需要判断当前响应的事件应该匹配到被代理元素中的哪一个或者哪几个。

事件冒泡

前面提到 DOM 中事件委托的实现是利用事件冒泡的机制,那么事件冒泡是什么呢?

在 document.addEventListener 的时候我们可以设置事件模型:事件冒泡、事件捕获,一般来说都是用事件冒泡的模型;

如上图所示,事件模型是指分为三个阶段:

  • 捕获阶段:在事件冒泡的模型中,捕获阶段不会响应任何事件;
  • 目标阶段:目标阶段就是指事件响应到触发事件的最底层元素上;
  • 冒泡阶段:冒泡阶段就是事件的触发响应会从最底层目标一层层地向外到最外层(根节点),事件代理即是利用事件冒泡的机制把里层所需要响应的事件绑定到外层;### 事件

    委托的优点

    1. 减少内存消耗

    试想一下,若果我们有一个列表,列表之中有大量的列表项,我们需要在点击列表项的时候响应一个事件;

    <ul id="list">
    <li>item 1</li>
    <li>item 2</li>
    <li>item 3</li>
    ......
    <li>item n</li>
    </ul>
    // ...... 代表中间还有未知数个 li

    如果给每个列表项一一都绑定一个函数,那对于内存消耗是非常大的,效率上需要消耗很多性能;

    因此,比较好的方法就是把这个点击事件绑定到他的父层,也就是 `ul` 上,然后在执行事件的时候再去匹配判断目标元素;

    所以事件委托可以减少大量的内存消耗,节约效率。

    2. 动态绑定事件

    比如上述的例子中列表项就几个,我们给每个列表项都绑定了事件;
    在很多时候,我们需要通过 AJAX 或者用户操作动态的增加或者去除列表项元素,那么在每一次改变的时候都需要重新给新增的元素绑定事件,给即将删去的元素解绑事件;

    如果用了事件委托就没有这种麻烦了,因为事件是绑定在父层的,和目标元素的增减是没有关系的,执行到目标元素是在真正响应执行事件函数的过程中去匹配的;

    所以使用事件在动态绑定事件的情况下是可以减少很多重复工作的。

    jQuery 中的事件委托

    jQuery 中的事件委托相信很多人都用过,它主要这几种方法来实现:

    • $.on: 基本用法: $(‘.parent‘).on(‘click‘, ‘a‘, function () { console.log(‘click event on tag a‘); }),它是 .parent 元素之下的 a 元素的事件代理到 $(‘.parent‘) 之上,只要在这个元素上有点击事件,就会自动寻找到 .parent 元素下的 a 元素,然后响应事件;
    • $.delegate: 基本用法: $(‘.parent‘).delegate(‘a‘, ‘click‘, function () { console.log(‘click event on tag a‘); }),同上,并且还有相对应的 $.delegate 来删除代理的事件;
    • $.live: 基本使用方法: $(‘a‘, $(‘.parent‘)).live(‘click‘, function () { console.log(‘click event on tag a‘); }),同上,然而如果没有传入父层元素 $(.parent),那事件会默认委托到 $(document) 上;(已废除)

原文地址:https://www.cnblogs.com/qdlhj/p/10719002.html

时间: 2024-08-02 23:13:23

JavaScript 事件委托详解的相关文章

事件委托详解

基本概念 事件委托,通俗地来讲,就是把一个元素响应事件(click.keydown......)的函数委托到另一个元素: 一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应到需要绑定的元素上时,会通过事件冒泡机制从而触发它的外层元素的绑定事件上,然后在外层元素上去执行函数. 举个例子,比如一个宿舍的同学同时快递到了,一种方法就是他们都傻傻地一个个去领取,还有一种方法就是把这件事情委托给宿舍长,让一个人出去拿好所有快递,然后再根据收件人一一分发

【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)--转

前言 javascript事件基础 事件捕获/冒泡 事件对象 事件模拟 移动端响应速度 PC与移动端鼠标事件差异 touch与click响应速度问题 结论 zepto事件机制 注册/注销事件 zepto模拟tap事件 tap事件的问题一览 点透问题 fastclick思想提升点击响应 实现原理 鬼点击 ios与android鼠标事件差异 事件捕获解决鬼点击 结语 前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜

JS中的事件委托详解(未完)

什么是JS事件委托呢? 首先,我们要明确什么是事件:所谓的事件就是像:onclick,onmouseover,onmouseover.......这些事件,那委托呢?就是指原来发生在这些事件上的元素,加到其它的元素身上来完成. JS事件委托的原理:就是利用冒泡的原理,把事件加到父级或是父级的父级身上,来触发执行操作. 使用事件委托的优势:1)提高性能: 2)新添加的元素也会有之前加的事件: 下面我们用例子来说明一下:点击改变li的背景颜色 HTML部分: 1 <ul id="ul1&quo

jquery事件委托详解

jQuery事件委托处理流程 上一章分析jQuery.event.add的时候已经分析了事件绑定,再把绑定的部分源码抽出来 if ( !(eventHandle = elemData.handle) ) { eventHandle = elemData.handle = function( e ) { //当一个事件被调用后页面已经卸载,则放弃jQuery.event.trigger()的第二个事件, return typeof jQuery !== core_strundefined &&

Javascript事件流详解

1.事件流 描述的是从文档页面接受事件的顺序. 冒泡事件流:即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播至最不具体的那个节点(文档). 捕获事件流:不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件. 2.事件处理程序 (1)HTML事件处理程序 (2)DOM0级事件处理程序 较为传统的方式:把一个函数值赋值给一个事件处理程序的属性.这种方法用的比较多,主要是因为它简单而且支持跨浏览器: (3)DOM2级事件处理程序 DOM2级的事件定义了两个方法

javascript事件委托机制详解

以个人前端工作面试经历来看,javascript事件委托是问的最多的一类题目之一,熟悉事件委托能够了解你对于javascript的掌握程度. 面试官可能问一下问题,现在有5个li待办事件,需要实现当点击一个li时实现弹出该li的信息 <ul class="top"> <li>橘子</li> <li>香蕉</li> <li>苹果</li> <li>梨子</li> <li>

jQuery 事件用法详解

jQuery 事件用法详解 目录 简介 实现原理 事件操作 绑定事件 解除事件 触发事件 事件委托 事件操作进阶 阻止默认事件 阻止事件传播 阻止事件向后执行 命名空间 自定义事件 事件队列 jquery中文文档 简介 jquery 之所以成为最受欢迎的前端库,很大一部分是得益于它的事件具有良好的语义,优秀的兼容性,并且便于管理和扩展. 在这里我会介绍 jquery 事件的一些比较基础的用法. 实现原理 jquery 事件脱胎于浏览器的 addEventListener (W3) 和 attac

.Net委托详解

搬运自http://wurang.me/2014/04/22/delegate.html [什么是委托] 委托是对函数的引用,它是一个引用类型,类似c/cpp中的函数指针.但它是类型安全的. 委托是一个类,定义了方法的类型,可以将方法当做另一个方法的参数传递. 委托就是一个安全的函数指针,用来执行函数方法的东西. [如何使用委托] 在.Net框架下,委托的使用方法经历了多次改变. 最初委托的使用方法如下: public delegate string MyDelegate(string name

cocos2dx+lua注册事件函数详解 事件

coocs2dx 版本 3.1.1 registerScriptTouchHandler             注册触屏事件 registerScriptTapHandler                  注册点击事件 registerScriptHandler                         注册基本事件 包括 触屏 层的进入 退出 事件 registerScriptKeypadHandler           注册键盘事件 registerScriptAccelera