iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >JavaScript中怎么实现事件代理和委托
  • 594
分享到

JavaScript中怎么实现事件代理和委托

2024-04-02 19:04:59 594人浏览 八月长安
摘要

javascript中怎么实现事件代理和委托,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JavaScript事件代理首先介绍

javascript中怎么实现事件代理和委托,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

JavaScript事件代理

首先介绍一下JavaScript的事件代理。事件代理在js世界中一个非常有用也很有趣的功能。当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数。这主要得益于浏览器的事件冒泡机制,后面会详细介绍。下面我们具体举个例子来解释如何使用这个特性。这个例子主要取自David  Walsh的相关文章(How JavaScript Event Delegation Works)。

假设有一个 UL 的父节点,包含了很多个 Li 的子节点:

<ul id="parent-list">   <li id="post-1">Item 1</li>   <li id="post-2">Item 2</li>   <li id="post-3">Item 3</li>   <li id="post-4">Item 4</li>   <li id="post-5">Item 5</li>   <li id="post-6">Item 6</li> </ul>

当我们的鼠标移到Li上的时候,需要获取此Li的相关信息并飘出悬浮窗以显示详细信息,或者当某个Li被点击的时候需要触发相应的处理事件。我们通常的写法,是为每个Li都添加一些类似onMouseOver或者onClick之类的事件监听。

function addListeners4Li(linode){     liNode.onclick = function clickHandler(){...};     liNode.onmouseover = function mouseOverHandler(){...} }  window.onload = function(){     var ulNode = document.getElementById("parent-list");     var liNodes = ulNode.getElementByTagName("Li");     for(var i=0, l = liNodes.length; i < l; i++){         addListeners4Li(liNodes[i]);     }    }

如果这个UL中的Li子元素会频繁地添加或者删除,我们就需要在每次添加Li的时候都调用这个addListeners4Li方法来为每个Li节点添加事件处理函数。这就添加的复杂度和出错的可能性。

更简单的方法是使用事件代理机制,当事件被抛到更上层的父节点的时候,我们通过检查事件的目标对象(target)来判断并获取事件源Li。下面的代码可以完成我们想要的效果:

// 获取父节点,并为它添加一个click事件 document.getElementById("parent-list").addEventListener("click",function(e) {   // 检查事件源e.targe是否为Li   if(e.target && e.target.nodeName.toUpperCase == "LI") {     // 真正的处理过程在这里     console.log("List item ",e.target.id.replace("post-")," was clicked!");   } });

为父节点添加一个click事件,当子节点被点击的时候,click事件会从子节点开始向上冒泡。父节点捕获到事件之后,通过判断e.target.nodeName来判断是否为我们需要处理的节点。并且通过e.target拿到了被点击的Li节点。从而可以获取到相应的信息,并作处理。

事件冒泡及捕获

之前的介绍中已经说到了浏览器的事件冒泡机制。这里再详细介绍一下浏览器处理DOM事件的过程。对于事件的捕获和处理,不同的浏览器厂商有不同的处理机制,这里我们主要介绍W3C对DOM2.0定义的标准事件。

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

JavaScript中怎么实现事件代理和委托

事件捕获:当某个元素触发某个事件(如onclick),顶层对象document就会发出一个事件流,随着DOM树的节点向目标元素节点流去,直到到达事件真正发生的目标元素。在这个过程中,事件相应的监听函数是不会被触发的。

事件目标:当到达目标元素之后,执行目标元素该事件相应的处理函数。如果没有绑定监听函数,那就不执行。

事件起泡:从目标元素开始,往顶层元素传播。途中如果有节点绑定了相应的事件处理函数,这些函数都会被一次触发。如果想阻止事件起泡,可以使用e.stopPropagation()(Firefox)或者e.cancelBubble=true(IE)来组织事件的冒泡传播。

jQuery和Dojo中delegate函数

下面看一下Dojo和Jquery中提供的事件代理接口的使用方法。

$("#link-list").delegate("a", "click", function(){   // "$(this)" is the node that was clicked   console.log("you clicked a link!",$(this)); });

jQuery的delegate的方法需要三个参数,一个选择器,一个时间名称,和事件处理函数。

而Dojo的与jQuery相似,仅是两者的编程风格上的差别:

require(["dojo/query","dojox/NodeList/delegate"], function(query,delegate){      query("#link-list").delegate("a","onclick",function(event) {     // "this.node" is the node that was clicked     console.log("you clicked a link!",this);   }); })

Dojo的delegate模块在dojox.NodeList中,提供的接口与jQuery一样,参数也相同。

优点通过上面的介绍,大家应该能够体会到使用事件委托对于WEB应用程序带来的几个优点:

1.管理的函数变少了。不需要为每个元素都添加监听函数。对于同一个父节点下面类似的子元素,可以通过委托给父元素的监听函数来处理事件。

2.可以方便地动态添加和修改元素,不需要因为元素的改动而修改事件绑定。

3.JavaScript和DOM节点之间的关联变少了,这样也就减少了因循环引用而带来的内存泄漏发生的概率。

写到这里,突然想起了之前对于Dojo  DataGrid的困惑:那么多的rows和cells,如何处理他们事件之间的关系。现在想想,使用委托就很简单了。所有的事件委托到grid最外层的节点上,当事件发生的时候通过一些方法来获取和添加事件的额外属性,如rowIndex,  cellIndex,之后在分配到onRowClick,onCellClick之类的处理函数上。

在JavaScript编程中使用代理

上面介绍的是对DOM事件处理时,利用浏览器冒泡机制为DOM元素添加事件代理。其实在纯JS编程中,我们也可以使用这样的编程模式,来创建代理对象来操作目标对象。这里引用司徒正美相关文章中的一个例子:

var delegate = function(client, clientMethod) {         return function() {             return clientMethod.apply(client, arguments);         }     }     var ClassA = function() {         var _color = "red";         return {             getColor: function() {                 console.log("Color: " + _color);             },             setColor: function(color) {                 _color = color;             }         };     };      var a = new ClassA();     a.getColor();     a.setColor("green");     a.getColor();     console.log("执行代理!");     var d = delegate(a, a.setColor);     d("blue");     console.log("执行完毕!");     a.getColor();

上面的例子中,通过调用delegate()函数创建的代理函数d来操作对a的修改。这种方式尽管是使用了apply(call也可以)来实现了调用对象的转移,但是从编程模式上实现了对某些对象的隐藏,可以保护这些对象不被随便访问和修改。

在很多框架中都引用了委托这个概念用来指定方法的运行作用域。比较典型的如dojo.hitch(scope,method)和ExtJS的createDelegate(obj,args)。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网html频道,感谢您对编程网的支持。

--结束END--

本文标题: JavaScript中怎么实现事件代理和委托

本文链接: https://www.lsjlt.com/news/69904.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中怎么实现事件代理和委托
    JavaScript中怎么实现事件代理和委托,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JavaScript事件代理首先介绍...
    99+
    2024-04-02
  • Javascript 中怎么实现事件流和事件委托
    今天就跟大家聊聊有关Javascript 中怎么实现事件流和事件委托,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。javascript 事件流和事件...
    99+
    2024-04-02
  • JavaScript中怎么实现事件委托
    JavaScript中怎么实现事件委托,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。事件是对象发送的消息,以发信号通知操作的发生。委托是可...
    99+
    2024-04-02
  • 怎么在JavaScript中实现事件委托
    怎么在JavaScript中实现事件委托?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。事件委托利用事件冒泡,指定一个事件处理程序,管理一系列的所有事件事件委托利用DOM元素...
    99+
    2023-06-15
  • js如何实现事件委托和事件代理
    这篇文章给大家分享的是有关js如何实现事件委托和事件代理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是事件委托/事件代理  利用事件的冒泡传播机制(触发当前元素的某一个行为...
    99+
    2024-04-02
  • JavaScript事件委托原理
    目录一、什么是事件委托二、事件委托的原理三、事件委托的作用一、什么是事件委托 事件委托也称为事件代理。就是利用事件冒泡,把子元素的事件都绑定到父元素上。如果子元素阻止了事件冒泡,那么...
    99+
    2024-04-02
  • jQuery中怎么实现事件委托
    jQuery中怎么实现事件委托,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。javascript的事件模型,采用"冒...
    99+
    2024-04-02
  • js中的事件委托怎么实现
    在JavaScript中,可以通过事件委托来简化事件处理程序的绑定和管理。事件委托是将事件处理程序绑定到其父元素,然后通过冒泡机制来...
    99+
    2023-09-29
    js
  • C#委托和事件怎么理解
    这篇文章主要介绍“C#委托和事件怎么理解”,在日常操作中,相信很多人在C#委托和事件怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#委托和事件怎么理解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-17
  • 如何理解javascript事件委托
    这篇文章主要介绍“如何理解javascript事件委托”,在日常操作中,相信很多人在如何理解javascript事件委托问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解...
    99+
    2024-04-02
  • JavaScript事件委托原理是什么
    JavaScript事件委托原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、什么是事件委托事件委托也称为事件代理。就是利用事件冒泡,把子元素的事件都绑定到父元素...
    99+
    2023-06-21
  • 什么是javascript事件委托
    本篇文章为大家展示了什么是javascript事件委托,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在javascript中,事件委托就是利用冒泡的原理,将事件加到父元素或祖先元素上,触发执行效果。...
    99+
    2023-06-14
  • C#中怎么使用委托和事件
    在 C# 中,委托和事件是一种常用的机制,用于实现事件驱动的编程模型。委托是一种类型,用于存储对方法的引用,而事件是委托的一种特殊用...
    99+
    2024-03-06
    C#
  • 怎么理解js事件委托
    这篇文章主要讲解了“怎么理解js事件委托”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解js事件委托”吧!每个函数都是对象,占用内存。内存中的对象越多,性能越差。解决事件处理过多问题的...
    99+
    2023-06-25
  • VB.NET下如何实现事件和委托
    这篇文章给大家分享的是有关VB.NET下如何实现事件和委托的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。委托是可用于调用其他对象方法的对象。它们有时被称为类型安全函数指针,因为它们与其他编程语言中所使用的函数指针...
    99+
    2023-06-17
  • JS中如何实现事件委托
    这篇文章主要介绍了JS中如何实现事件委托,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。事件委托(也叫事件代理),其实这个问题也简单,要想弄明...
    99+
    2024-04-02
  • C#中的委托和事件
    目录一、委托1、什么是委托1.1 定义委托1.2 声明并实例化委托1.3 委托实例的调用2、委托类型和委托实例2、多种途径实例化委托3、链式委托总结二、事件1、什么是事件2、如何声明...
    99+
    2024-04-02
  • javascript事件冒泡,事件捕获和事件委托详解
    1、事件冒泡:在javascript事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览器可能到window为止。并不是所有的事件...
    99+
    2024-04-02
  • JavaScript 事件委托:让你的代码起飞!
    事件委托是一种事件处理机制,它允许你在父元素上处理子元素的事件。这种机制可以减少事件处理器的数量并提高代码的性能和可维护性。 为了演示事件委托,我们创建一个简单的 HTML 页面。这个页面包括一个 div 元素和一个 button 元素...
    99+
    2024-02-06
    JavaScript 事件委托 事件冒泡 性能优化 可维护性
  • JavaScript事件的委托(代理)的用法示例详解
    目录简介示例:事件委托写法1:事件委托写法2:每个子元素都绑定事件示例:新增元素写法1:事件委托写法2:每个子元素都绑定事件简介 说明 本文用示例介绍JavaScript中的事件(E...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作