在绑定节点事件处理程序时遇到的问题:

  • 每个 函数都是对象,都会占用内存;内存中的对象越多,性能就越差。
  • 其次,必须事先指定所有事件处理程 序而导致的 DOM访问次数,会延迟整个页面的交互就绪时间。

采用事件委托的优点:

  1. document 对象很快就可以访问,而且可以在页面生命周期的任何时点上为它添加事件处理程序 (无需等待 DOMContentLoaded 或 load 事件)。换句话说,只要可单击的元素呈现在页面上, 就可以立即具备适当的功能。
  2. 在页面中设置事件处理程序所需的时间更少。只添加一个事件处理程序所需的DOM引用更少, 所花的时间也更少。
  3. 整个页面占用的内存空间更少,能够提升整体性能。
  4. 绑定事件后,即使目标元素是以后再添加进来的也有效。

适合采用事件委托技术的事件包括click、mousedown、mouseup、keydown、keyup和keypress等。

下面以给每个li 元素绑定click事件为例:

1 <ul class="container">
2 <li class="item">li-1</li>
3 <li class="item">li-2</li>
4 <li class="item">li-3</li>
5 <li class="item">li-4</li>
6 <li class="item">li-5</li>
7 <li class="item">li-6</li>
8 </ul>

原生JS事件委托:

 1 var _li = document.getElementsByTagName('li'),
2 _ul = document.getElementsByTagName('ul')[0];
3
4
5 /* 事件委托绑定事件 */
6 _ul.onclick = function (e) {
7 var _it = e.target;
8 if (_it.tagName == 'LI') {
9 // 能进里说明当前点击的是LI元素
10 console.log(_it.innerHTML);
11 }
12 }

jQuery事件委托:

  • on()方法

    1 /*
    2 * .on()方法,jQuery 1.7新增,提供绑定事件处理程序所需的所有功能。帮助从旧的jQuery事件方法转换,see .bind(), .delegate(), 和 .live().
    3 * */
    4 $('ul').on('click', 'li', function (e) {
    5 console.log(e.target.innerHTML);
    6 });
  • delegate()方法
    1 $('ul').delegate('li', 'click', function (e) {
    2 console.log(e.target.innerHTML);
    3 });
  • live()方法
    1 /*
    2 * 从 jQuery 1.7 开始,不再建议使用 .live() 方法。请使用 .on() 来添加事件处理。使用旧版本的用户,应该优先使用 .delegate() 来替代 .live()。
    3 * */
    4 $('li').live('click', function (e) {
    5 console.log(e.target.innerHTML);
    6 });

到此完结。

原生JS及jQuery中事件委托的写法的更多相关文章

  1. JS与Jquery的事件委托——解决了绑定相同事件的问题

    概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完 ...

  2. JS与Jquery的事件委托

    参考:http://www.ituring.com.cn/article/467 概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委 ...

  3. JS与Jquery的事件委托机制

    传送:http://www.ituring.com.cn/article/467 概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委 ...

  4. 原生 JS 与 jQuery 中的 AJAX

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更 ...

  5. 原生JS和jQuery中基本的节点操作

    js中节点操作**document.createElement()**用来生成网页元素节点,参数为元素的标签名: **document.createTextNode()**用来生成文本节点,参数为所要 ...

  6. 原生js模拟jquery中的addClass和removeClass方法

    js代码: //添加类 function addClass(obj,className) { if(obj.className == '') { //如果没有class obj.className = ...

  7. js和jquery中有关透明度操作的问题

    在日常开发的网站中,常常会用到设置透明度问题,最简单的就是图片的淡入淡出效果.下面我介绍一下在原生js和jQuery中设置透明度的相关问题和注意点: 1 透明度样式设置       透明度在IE浏览器 ...

  8. js和jquery中的事件委托

    [转+自己的修改] 概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却 ...

  9. 原生js实现jquery库中部分事件的功能(jquery库封装二)

    继续昨天的封装,今天的部分继昨天选择器之后实现了css样式的获取和添加,attr的获取和添加和一部分事件的封装:只是我自己的理解,不妥之处欢迎大家在评论中提出,相互学习,共同提高 /** * Crea ...

  10. JavaScript中函数和类(以及this的使用<重点>,以及js和jquery讲解,原生js实现jquery)

    1.javascript中以函数来表示类: 一般函数是小写开头:function foo() 类开头是大写:function Foo() 实例化类: obj = new Foo() 其他属性就同类是一 ...

随机推荐

  1. kubernetes强制删除namespace

    1.执行命令删除namespace后一直显示Terminating,无法删除namespace [root@k8s-master1 ~]# kubectl get ns NAME STATUS AGE ...

  2. 【2】locust性能测试原理分析+登录测试脚本+总结

     login_per_test1.py #对登录功能进行单点性能测试(一组测试数据)#发送首页请求,通过locust进行性能测试from locust import HttpLocust,task,T ...

  3. 构建自动发现的Docker服务架构

    ------------恢复内容开始------------ 建立consul服务 在建立consul服务中,每个提供服务的节点(在Docker主机上)都要部署和运行consul的client,ser ...

  4. python写入sqlserver中文乱码问题

    需求是python3开发,数据库是sqlserver,第一次用python操作sqlserver,写入数据时,中文全部变成了?? 试了pyodbc,但缺少sqlserver驱动 试了sqlStr.en ...

  5. 如何在超星下载非资料页面的ppt

    首先打开迅雷(没有就复制到网页下载) 点击f12 点击网络,筛查出输入flag,在响应模块中找到ppt,复制网址并下载

  6. SQL 用 in 大于 1000 问题解决

    -- 今天生成环境数据突然多,系统异常 解决方案(必须用in 业务情况),也可以用其他函数解决 union all  或者 exists 等 1:截取list List<Integer>  ...

  7. Simple Algebra

    题意 给定方程\(f(x)=ax^2+bxy+cy^2\)和参数\(a\),\(b\),\(c\),试确定该方程的取值是否恒非负. 题解 参照文章http://math.mit.edu/~mckern ...

  8. Redis集群(主从复制)

    主从复制主从复制原理 Redis集群中有很多Redis服务器,这些Reids服务器分为主服务器和从服务器. 从服务器会向主服务器发送命令:SYNC命令. 主服务器接收到SYNC命令后,开始执行GBSA ...

  9. 解决java.sql.SQLException: null, message from server: "Host 'XXX' is not allowed to connect异常

    Sqoop连接MySQL报异常.这个异常是数据库只允许localhost或127.0.0.1访问,不允许远程访问.我用的本机IP都不行. 解决办法:修改访问权限即可. 打开cmd,进入mysql fl ...

  10. python——NLP关键词提取

    关键词提取顾名思义就是将一个文档中的内容用几个关键词描述出来,这样这几个关键词就可以提供这个文档的大部分信息,从而提高信息获取效率. 关键词提取方法同样分为有监督和无监督两类,有监督的方法比如构造一个 ...