Javascript中的事件委托机制

事件委托

事件委托,顾名思义,就是将本来要触发在A元素身上的事件,委托给B元素来触发,例如像onclick,onmouseover等事件都可以通过事件委托去触发。

事件委托实际上是通过事件冒泡的原理,将事件绑定在父元素或者祖先元素上,通过父元素或祖先元素触发相应的事件。

通过单纯的文字描述可能不太好理解,我们来通过代码去看看事件委托机制有哪些优点?

优点1-提高Javascript性能

使用事件委托机制绑定事件,可以减少内存的占用,从而提高事件处理速度。我们通过具体的实例来进行讲解。

我们要完成这样一个功能,页面上有一个列表,对每个列表元素进行点击,输出对应列表的值。

HTML代码

<ul id=‘list‘>
    <li id=‘item1‘>item1</li>
    <li id=‘item2‘>item2</li>
    <li id=‘item3‘>item3</li>
    <li id=‘item4‘>item4</li>
    <li id=‘item5‘>item5</li>
</ul>

传统的Javascript写法

如果采用原始的Javascript写法,有一种最笨的办法是通过id获取到每个li元素,然后在每个li元素上绑定onclick事件,这种方法由于会有很多重复代码,这么low的代码我们就不写在这里。

这里写一个更好一点的方法,通过标签名获取到类数组元素,然后通过循环给每个li元素绑定事件,这样就只需要出现一次绑定事件的代码。

window.onload = function () {
    var aUl = document.getElementById(‘list‘);
    var aLi = aUl.getElementsByTagName(‘li‘);

    for (var i = 0; i < aLi.length; i++) {
        aLi[i].onclick = function () {
            console.log(this.innerText);
        };
    }
};

通过上述的代码,在页面点击相应的li元素后,可以看到控制台输出相应的li元素值,达到我们的目的。

但是,我们试想这样一种情况,如果页面上li元素过多,这样一个个绑定事件的做法是不是会很耗性能?这里我们就可以采用事件委托机制来解决这个问题。

事件委托写法

上述HTML部分的代码不变,我们只需要修改Javascript部分的代码。我们来看看通过事件委托如何实现。

  1. 因为事件委托是将事件绑定在父元素上,因此我们首先需要获取到父元素ul。
  2. 在事件委托中,我们需要用到event对象,不管在哪个事件中都会存在event对象。
  3. 考虑到浏览器的兼容性,通过event对象的target或者srcElement属性获取冒泡过程中的元素。
  4. 进行判断是不是需要处理的元素,然后执行事件。
时间: 2024-11-05 18:45:43

Javascript中的事件委托机制的相关文章

JQuery中的事件委托机制:delegate和undelegate

考虑下面这种场景:如果1个div下面有3个button,点击每个按钮的时候,需要打印出当前按钮的ID. <div id="parent"> <input type="button" id="a" value="1"></input> <input type="button" id="b" value="2"></i

在Unity中使用事件/委托机制(event/delegate)进行GameObject之

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 一对多的观察者模式机制有什么缺点? 如果你对如何在Unity中使用事件/委托机制还不太了解,建议您查看我的前一篇文章:[Unity3D技巧]在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 在前一篇博客里面,我们写到

【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在前面两篇文章: [Unity3D基础教程]给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D [Unity3D基础教程]给初学者看的Unity教程(三):通过制作Flappy Bird了解Native 2D中的Sprite,Animation 我们了解

javascript中的事件委托

这几天看到一个面试题,大概就是,让你给1000个li都添加一个click事件,应该怎么添加?大多数人第一开始的感觉可能就是,每个li上边都添加一个呗,那要是这样的话,估计面试的时候就会GG了,这里就是撤出了我们的事件冒泡和捕获机制,以及事件委托机制,对于上边这些,我们慢慢来看. 首先说一下事件冒泡和事件捕获机制,事件冒泡是有微软公司提出来的,事件捕获是有网景公司提出来的,当时两家是争论的不可开交,后来w3c也没办法,就采取了折中的方式,事件产生后先捕获后冒泡, 通常,在js中监听事件的方法共有三

在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 引子 在前面两篇文章: 我们了解了2D中的Sprite,Animation,RigidBody和Collider,在继续开发游戏的过程中,我们会遇到这样的问题,如何处理GameObject之间的相互调用,比如说在FlappyBird中我们在小鸟撞倒管子的时候,要把这

Javascript中的事件委托(事件代理)

之前我们说过用 for 循环绑定事件 没看过的点这里   今天我们介绍一种更加方便的方法,就是事件委托,也叫事件代理: 件事委托是什么 事件委托:简单说就是把一个事件交给别人来完成,就是利用冒泡原理,将事件绑定到节点的父级节点上,触发执行效果. 件事委托的好处 提高Javascript性能.假如现在有个 ul,里面有10个 li,每个 li 都需要触发事件,之前我们说过可以用 for 循环,遍历所有的 li,然后添加事件,这样会影响Javascript性能. 动态绑定事件,可以给暂未存在的元素绑

JavaScript事件委托原理及Jquery中的事件委托

概念 事件委托,通俗来说就是将元素的事件委托给它的父级或者更外级元素处理. 事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡:事件开始由最具体的元素接收,然后逐级向上传播到较为不具体的节点(或文档). 事件捕获:事件开始由不太具体的节点接收,然后逐级向下传播到最具体的节点.它与事件冒泡是个相反的过程. DOM2级事件规定的事件流包括三个阶段: 事件捕获 目标阶段 事件冒泡 原理 事件委托就是利用事件冒泡机制实现的. 假设有一个列表,要求点击列表项弹出对应字段. <ul id="my

JavaScript系列之事件冒泡机制简介

JavaScript系列之事件冒泡机制 DOM事件流(event flow )存在三个阶段:事件捕获阶段.处于目标阶段.事件冒泡阶段,事件冒泡顺序是由内到外进行事件传播,事件冒泡是由IE开发团队提出来的,即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播. 听了简介介绍之后,您可能不理解,所以举个例子: <html> <head> <title>js事件冒泡测试</title> </head> <body>

javascript中的错误处理机制

前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较差的用户体验.由于任何javascript错误都可能导致网页无法使用,因此作为开发人员,必须要知道何时可能出错,为什么会出错,以及会出什么错.本文将详细介绍javascript中的错误处理机制 error对象 error对象是包含错误信息的对象,是javascript的原生对象.当代码解析或运行时发生错误,javascript引擎就会自动产生并抛出一个error对象的实例,然后整个程序