[jQuery] 谈一下Jquery中的bind(),live(),delegate(),on()的区别?

[jQuery] 谈一下Jquery中的bind(),live(),delegate(),on()的区别?

在我们深入了解这些方法之前,我们先来一段常见的的HTML,作为我们编写jquery示例方法使用的样本。<ul id="members" data-role="listview" data-filter="true"><!-- ... 其他li ... --><li><a href="detail.html?id=10" rel="external nofollow" ><h3>John Resig</h3><p><strong>jQuery Core Lead</strong></p><p>Boston, United States</p></a></li><!-- ... 其他li ... -->
</ul>使用Bind方法.bind()方法将事件类型和一个事件处理函数直接注册到了被选中的DOM元素中。这个方法被使用得最久,在此期间,它很好的解决了各种跨浏览器的问题。当使用它来连接事件处理函数时,它仍然非常简洁,但是也存在着一些性能方面的问题,将在下面罗列出来。/* .bind() 方法将事件类型和一个事件处理函数直接注册到了被选中的DOM元素中。 .click() 方法只是.bind() 方法的简写。
*/$( "#members li a" ).bind( "click", function( e ) {} ); 
$( "#members li a" ).click( function( e ) {} );.bind()方法将会把事件处理函数连接到所有匹配的a标签。这种方式并不好。这样做的话,它不仅在所有匹配的元素中隐含地迭代附加事件处理函数,而且这些操作非常浪费(多余),因为这些相同的事件处理函数是被一遍一遍的重复的添加到所有匹配的标签上。优点:适用于各种浏览器连接事件处理函数非常方便快捷可以使用 .click() ,  .hover()等简写方法来更方面地连接事件处理函数对于一个简单的ID选择器,使用.bind() 方法不仅可以很快地连接事件处理函数,而且当事件被触发时, 事件处理函数几乎是马上就被调用了缺点:这样方法会将所有的事件处理函数附加到所有匹配的元素不可以动态地匹配相同选择器的元素当操作大量匹配的元素时会有性能方面的问题附加操作是在前期完成的,这可能导致页面加载时存在性能问题使用Live方法.live()方法使用了事件委托的概念来实施其所谓的“魔法”。你调用live()方法的方式就像是调用bind()方法那样方便。然而在这表面之下, .live()方法与前者的实现方式大不相同。 .live()方法将与事件处理函数关联的选择器和事件信息一起附加到文档的根级元素(即document)。通过将事件信息注册到document上,这个事件处理函数将允许所有冒泡到document的事件调用它(例如委托型、传播型事件)。一旦有一个事件冒泡到document元素上,Jquery会根据选择器或者事件的元数据来决定哪一个事件处理函数应该被调用,如果这个事件处理函数存在的话。这个额外的工作将会在用户交互时对性能方面造成一定的影响,但是初始化注册事件的过程相当地快。/* 方法将与事件处理函数关联的选择器和事件信息一起附加到文档的根级元素(即document) ( "#members li a" & "click" ) */$( "#members li a" ).live( "click", function( e ) {} );.bind()这个例子与上面bind()方法的例子对比的话有一个优点在于它仅仅把事件处理函数附加到document元素一次,而不是很多次。这样不仅更快,而且还减少了性能的浪费。然而,使用这个方法也会带来很多问题,下面将一一列出。优点:所有的事件处理函数都只会被注册一次,而不是像bind()那样进行多次注册将bind()方法升级到live()方法非常方便,你仅需要将"bind"替代为"live"就可以了那些被动态添加到DOM的元素也将被神奇的匹配到,因为真实的事件信息是被注册到document元素上的你可以在文档加载完之前连接事件处理函数,这样可以帮助你更好地利用你可能没有用的时间缺点:这个方法在Jquery 1.7以后的版本被弃用了,你应该在你的代码里逐步放弃使用它使用这个方法时链式操作没有得到正确的支持,可能会出现某些错误所做的匹配操作基本上没用因为它只用于在document元素上注册事件处理函数使用 event.stopPropogation() 方法将会没用,因为事件总是已经被委托到了document元素上因为所有的选择器或者事件信息都被附加到document元素上了,所以一旦有一个事件要调用某个事件处理函数,Jquery会在一大堆储存的元数据中使用matchesSelector方法来决定哪一个事件处理函数将会被调用,如果这个函数有的话。因为你所连接的事件总是被委托到document上,所如果你的DOM的层级很深的话,这会导致一定的性能问题使用Delegate方法.delegate()方法与live()方式实现方式相类似,它不是将选择器或者事件信息附加到document,而是让你指定附加的元素。就像是live()方法一样,这个方法使用事件委托来正确地工作。如果你跳过了前面关于 .live() 方法的介绍,你可能要回去重新看看它,因为这里涉及到之前我所阐述的一些内部逻辑/* .delegate() 方法会将选择器和事件信息 ( "li a" & "click" ) 附加到你指定的元素上 ( "#members" )。
*/$( "#members" ).delegate( "li a", "click", function( e ) {} );.delegate()方法十分强大。在上面这个例子中,与事件处理函数关联的选择器和事件信息将会被附加到( #members" )这个元素上。这样做比使用live()高效多了,因为live()方法总是将与事件处理函数关联的选择器和事件信息附加到document元素上。另外,使用.delegate()方法解决许多其他问题。请参阅下方列出的详细信息。优点:你可以选择将选择器或者事件信息附加到指定的元素。匹配操作实际上在前面并没有执行,而是用来注册到指定的元素。链式操作可以得到正确的支持Jquery仍然需要迭代这些选择器或者事件信息来匹配元素,不过因为你可以选择哪一个元素作为根元素,所以筛选的量会大幅减少因为这项技术使用了事件委托机制,它可以匹配到被动态地添加到DOM的元素你可以在文档加载完之前连接事件处理函数缺点:从.bind()方法不可以直接升级到.delegate()方法Jquery仍然需要使用marchesSelector方法在附加到指定根元素的选择器或者事件信息中筛选决定哪一个事件处理函数会被调用。然而,附加到指定根元素的元数据会比使用live()方法的时候要小得多。当操作大量匹配的元素时会有性能方面的问题附加操作是在前期完成的,这可能导致页面加载时存在性能问题使用On方法你知道吗,在Jquery 1.7版本中.bind() , .live() 和.delegate()方法只需要使用.on()方法一种方式来调用它们。当然.unbind() , .die() 和.undelegate()方法也一样。一下代码片段是从Jquery 1.7版本的源码中截取出来的bind: function( types, data, fn ) {return this.on( types, null, data, fn );
},
unbind: function( types, fn ) {return this.off( types, null, fn );
},live: function( types, data, fn ) {jQuery( this.context ).on( types, this.selector, data, fn );return this;
},
die: function( types, fn ) {jQuery( this.context ).off( types, this.selector || "**", fn );return this;
},delegate: function( selector, types, data, fn ) {return this.on( types, selector, data, fn );
},
undelegate: function( selector, types, fn ) {return arguments.length == 1 ? this.off( selector, "**" ) : this.off( types, selector, fn );
}考虑到这一点,使用.on()方法看起来像以下方式一样.../* Jquery的 .bind() , .live() 和 .delegate() 方法只需要使用`.on()`方法一种方式来调用它们 */// Bind
$( "#members li a" ).on( "click", function( e ) {} ); 
$( "#members li a" ).bind( "click", function( e ) {} );// Live
$( document ).on( "click", "#members li a", function( e ) {} ); 
$( "#members li a" ).live( "click", function( e ) {} );// Delegate
$( "#members" ).on( "click", "li a", function( e ) {} ); 
$( "#members" ).delegate( "li a", "click", function( e ) {} );你可能注意到了,我如何使用.on()方法决定了它如何调用其他方法。你可以认为.on()方法被具有不同签名的方法”重载“了,而这些方法实现了不同的事件绑定的连接方式。 .on()方法的出现为API带来了很多方面的一致性,并希望让事情变得不那么混乱。优点:使各种事件绑定方法一致。因为在Jquery源码中.bind() , .live() 和.delegate()方法实际上是调用了此方法,因此简化了jQuery代码库并删除了一级重定向。这种方式仍然提供了使用.delegate()方法的优点,并且仍然提供对.bind()方法的支持,如果你需要的话。缺点:给人带来了一些疑惑,因为方法的实际执行方式将根据你如何调用方法而改变。

个人简介

我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易,
但坚持一定很酷。欢迎大家一起讨论

主目录

与歌谣一起通关前端面试题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

地贝扫地机器人维修_扫地机器人常见故障及维修方法

扫地机器人虽然智能&#xff0c;但是毕竟是人造机器&#xff0c;在使用很长时间后&#xff0c;多多少少会出现一些小问题。今天小编给大家分享下扫地机器人常见故障及维修方法&#xff0c;可供参考。扫地机器人常见故障及维修方法一、开机毫无反应对于小白的许多用户来说&#…

VSS 详解

VSS概述版本控制是工作组软件开发中的重要方面&#xff0c;它能防止意外的文件丢失、允许反追踪到早期版本、并能对版本进行分支、合并和管理。在软件开发和您需要比较两种版本的文件或找回早期版本的文件时&#xff0c;源代码的控制是非常有用的。Visual SourceSafe 是一种源代…

html生成1-32位随机数,如何生成一个32位的随机数 | 求索阁

CStringA CreateHex(int max){CStringA precision;precision.Format("%x",max);int size precision.GetLength();int num_align size%4; // 按多少位对齐if(num_align <4)num_align 4;else if (num_align <8) // 这里我假设最大数32位,如果…

[jQuery] 你知道自定义事件吗?jQuery里的fire函数是什么意思,什么时候用?

[jQuery] 你知道自定义事件吗&#xff1f;jQuery里的fire函数是什么意思&#xff0c;什么时候用&#xff1f; 1种是把那个bai函数放du到zhiready函数外面。 第dao2种是在ready函数zhuan里面加上window.deleteStu deleteStu; 即shu: $(function(){ function deleteStu(id){ al…

Page_Load的问题

前些天一直有个疑问&#xff1a;在Aspx的cs文件里有Page_Load函数&#xff0c;这个函数对应于Page类的Load事件&#xff0c;但是却搞不清楚Page_Load是如何绑定到Load的&#xff0c;没有类似this.Load ...这样的代码&#xff0c;没有显式的Event绑定&#xff0c;如何把Page_Loa…

「洛谷2495」「BZOJ3052」「SDOI2001」消耗战【虚树+树形动态规划】

题目大意 给你\(k\)个点&#xff0c;让这一些点和一号节点断开&#xff0c;删去某一些边&#xff0c;求最小的删去边权之和。 做题的心路历程 做了\(HG\)昨天的模拟赛&#xff0c;深深感觉到了窝的菜&#xff0c;所以为了\(A\)掉T1这一道毒瘤&#xff0c;窝就来学习一下虚树。 …

2021年安徽普通高考考试成绩查询,安徽省教育招生考试院:2021年安徽高考查分入口、查分系统...

【摘要】为了方便安徽高考考生能及时查询到2021年高考成绩&#xff0c;高考频道特别整理了的安徽省教育招生考试院2021年安徽高考成绩查询入口、查分系统&#xff0c;考生可在成绩公布时直接点击下面的链接进行查分&#xff0c;预祝大家金榜题名&#xff01;自安徽省教育招生考…

python 比赛成绩预测_大数据新研究:用六个月的跑步记录准确预测马拉松完赛成绩...

随着疫情得到控制&#xff0c;各个城市的马拉松比赛又开始相继恢复。从线上马拉松终于可以再次到各个城市不同的赛道上奔跑&#xff0c;无疑是跑者的福音。积压了大半年的情绪&#xff0c;也激发了跑者更高的训练热情&#xff0c;带来了更多跑量的累积。而准备一场马拉松比赛&a…

[jQuery] 你知道js和jQuery是什么关系吗?

[jQuery] 你知道js和jQuery是什么关系吗&#xff1f; jQuery是js的函式庫&#xff0c;並不能稱為框架。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

求最大素数和最小素数

#include "math.h"#include "stdio.h"/**//* ′ yo D y&#xffe1; kissrat′ 2 μ aD′ a*/voidmain(){ long m,m1,i,k; for(m100000002;m<100001000;m6){ m1m-1; ksqrt(m1); for (i3;i<k;i2)if(m1%i0) br…

Python之操作HBASE数据库

目前有两个库可以操作HBASE&#xff1a;hbase-thrift 和 happybase happybase使用起来比较简单方便&#xff0c;因此重点学习该库&#xff0c;hbase-thrift只做简要介绍。 &#xff08;一&#xff09;hbase-thrift 1、使用前先添加库和依赖库&#xff1a; pip install thrift …

fla 走迷宫游戏 源码_迷宫新玩法,果断一试

迷宫&#xff0c;真的是谜一样的存在&#xff0c;大到几十岁的成年人&#xff0c;小到三岁小儿&#xff0c;都对其没有抵抗力。而迷宫君也是真给力&#xff0c;除了能给人带来愉悦感与成就感&#xff0c;还能同时锻炼专注力、空间感、思维力、视觉追踪等&#xff0c;是儿童感统…

电脑桌面老是弹出计算机,电脑桌面老是弹出游戏怎么解决

如果玩游戏时桌面始终自动弹出&#xff0c;该怎么办&#xff1f;在360游戏模式下玩就足够了如何解决游戏在计算机上弹出的问题&#xff1f; _1首先打开我们的计算机&#xff0c;在我们的计算机桌面上找到计算机管家&#xff0c;然后单击它。 2.输入后&#xff0c;单击屏幕右下方…

[jQuery] jQuery是通过哪个方法和Sizzle选择器结合的?

[jQuery] jQuery是通过哪个方法和Sizzle选择器结合的&#xff1f; 通过创建一个div元素&#xff0c;检测被传入的fn是否被当前浏览器支bai持 function assert( fn ) { var div document.createElement("div");//此处用try-catch的原因是&#xff1a;被传入的fn很有…

用OmniPeek快速定义的过滤器来抓网页提交信息

编写网络程序的人&#xff0c;经常要抓取HTTP操作过程的一些数据&#xff0c;常用的软件有HTTPSniffer、httpLook等软件&#xff0c;这些软件比常简单&#xff0c;这儿就不作介绍了。这里重点介绍一下用OmniPeek来抓取数据包。OmniPeek 是一款非常优秀的网管软件&#xff0c;功…

类的构造器-init和new

提到构造器&#xff0c;大家都会想到 __init__&#xff0c;那么__new__是什么&#xff1f;也是构造器。 init 构造器 都很熟悉了&#xff0c;直接上代码 class MyClass(object):def __init__(self):passdef m1(self):print(3)mc MyClass() mc.m1() # 3 是不是很简单 别…

c++ dll发消息到主窗口_PyQt5学习笔记(五)窗口图形绘制

PyQt5提供了绘制图形的API&#xff0c;支持绘制&#xff1a;文本各种图形&#xff08;直线&#xff0c;点&#xff0c;椭圆&#xff0c;弧&#xff0c;扇形&#xff0c;多边形等&#xff09;图像绘制图形需要一个类QPainter。基本的绘制过程&#xff1a;# 创建QPainter对象 pai…

[jQuery] 针对jQuery性能的优化方法有哪些?

[jQuery] 针对jQuery性能的优化方法有哪些&#xff1f; show slide animate 等频繁修改 dom 很耗性能&#xff0c;可采用 jquery.transit 插件等使用单个 id 或 class 选择器当然也是优化点咯&#xff0c;元素选择器是真的会卡每次调用 $() 其实都是生成一个超大的对象&#xf…

[转] SQL Server中的行列转换问题

原表结构序号性别部门工资1男部门a8002女部门b9003男部门a4004女部门d 14005男部门e12006男部门f5007女部门a 3008男部门d10009女部门d123010女部门b200011男部门c200012男部门b1200最终显示 部门名 人数 男 女 小于800元 从800至999 从1000元至1190元 大于12…

vue-cli@2的原理解析

作为一个菜鸟&#xff0c;我有一颗好奇的心&#xff0c;每当vue init 的时候&#xff0c;看到那流畅的进度和神奇的结果&#xff0c;心里都充满一窥其本质的期望…… 以下就是我不断的console&#xff0c;大致理出来的一个流程心得&#xff0c;纪录在此&#xff0c;以作备忘。 …