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

  • 每个 函数都是对象,都会占用内存;内存中的对象越多,性能就越差。
  • 其次,必须事先指定所有事件处理程 序而导致的 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. PLSQL中文乱码问题(显示问号)解决办法

    select userenv('language') from dual; 在环境变量的系统变量中添加配置: NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16GBK 这个 ...

  2. dialog弹窗里生成二维码 (reading qppendChild)

    在dialog弹窗里生成二维码第一次点击时 dialogFormVisible.value=false,二维码生成时会找不到对象可以用nextTick()函数 将二维码生成代码放到nextTick() ...

  3. Linux下的zip和tar压缩解压缩命令详解

    一.zip压缩工具 zip的压缩包在windows和linux中都比较常用,它可以压缩目录和文件,压缩时录时,需要指定目录下的文件.zip后面先跟目标文件名,即压缩后得自定义压缩包名,然后跟要压缩的文 ...

  4. UGUI获取文本的字符内容像素宽度 【转】

    在做文本框的时候,我们经常碰到需要计算字符输入的长度,然后适当地做处理.这个时候不能直接了当地拿text.Length来用,原因有: 1.字符会因为fontSize的大小不同而有不同的宽度: 2.即使 ...

  5. element-ui的自定义表头

    自定义表头 需求:之前在做一个项目的时候,原型图要求表头文字需要额外解释就会在文字后面标注 1,2作为上标 html中提供了<sup></sup>和<sub>< ...

  6. UE4.27 新版本像素流送插件配置

    UE4.27 像素流送新版插件部署命令 以下内容参考自UE5官方文档:https://docs.unrealengine.com/5.0/en-US/unreal-engine-pixel-strea ...

  7. Mysql Dao

    1 package dao; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sq ...

  8. ufw-防火墙添加22端口

    sudo ufw allow ssh/tcp 或 ufw allow 22/tcp 添加拒绝规则也是同样的招数.我们假设你想拒绝 ftp 访问, 你只需输入 sudo ufw deny ftp

  9. 渗透测试工具&导航合集

    #前言 表哥们一般都有自己强大的工具库,今天我也稍作整理,分享交流出来一部分 #信息收集 ####dirbuster kali自带的一款工具,fuzz很方便 ####gorailgun 一款自动化做的 ...

  10. Kubernetes--部署Ingress控制器(Nginx)

    Ingress控制器自身是运行于Pod中的容器应用,一般是Nginx或Envoy一类的具有代理及负载均衡功能的守护进程,它监视着来自于API Server的Ingress对象状态,并以其规则生成相应的 ...