首页 web前端 js教程 jQuery事件绑定和委托实例_jquery

jQuery事件绑定和委托实例_jquery

May 16, 2016 pm 04:30 PM
jquery 事件 委托 绑定

本文实例讲述了jQuery事件绑定和委托。分享给大家供大家参考。具体方法如下:

jQuery事件的绑定和委托可以用多种方法实现,on()  、 bind()  、 live()  、 delegate() ,还有one()。
 
有时我们可能会像下面这样绑定一个事件:

复制代码 代码如下:
$("#div1").click(function() { 
    alert("点击后触发"); 
});

上面的事件绑定,我们可以通过多种方式去实现:
 
1. on()

复制代码 代码如下:
//无数据参数 
$("p").on("click", function(){ 
alert( $(this).text() ); 
}); 
 
//有数据参数 
function myHandler(event) { 
alert(event.data.foo); 

$("p").on("click", {foo: "bar"}, myHandler)

与on()对应的是off(),用来移除事件绑定:

复制代码 代码如下:
var foo = function () { 
  // code to handle some kind of event 
}; 
// ... now foo will be called when paragraphs are clicked ... 
$("body").on("click", "p", foo); 
 
// ... foo will no longer be called. 
$("body").off("click", "p", foo);

off():移除on()进行的绑定
one():只绑定一次。
 
2. bind()

参数:
(type,[data],function(eventObject))
type: 含有一个或多个事件类型的字符串,由空格分隔多个事件。比如"click"或"submit",还可以是自定义事件名。
data:作为event.data属性值传递给事件对象的额外数据对象
 
fn:绑定到每个匹配元素的事件上面的处理函数
 
(type,[data],false)
type:含有一个或多个事件类型的字符串,由空格分隔多个事件。比如"click"或"submit",还可以是自定义事件名。
data:作为event.data属性值传递给事件对象的额外数据对象
 
false: 将第三个参数设置为false会使默认的动作失效。
 
同时绑定多个事件类型:

复制代码 代码如下:
$('#foo').bind('mouseenter mouseleave', function() { 
  $(this).toggleClass('entered'); 
});

同时绑定多个事件类型/处理程序:

复制代码 代码如下:
$("button").bind({ 
  click:function(){$("p").slideToggle();}, 
  mouseover:function(){$("body").css("background-color","red");},   
  mouseout:function(){$("body").css("background-color","#FFFFFF");}   
});

你可以在事件处理之前传递一些附加的数据。

复制代码 代码如下:
function handler(event) { 
  alert(event.data.foo); 

$("p").bind("click", {foo: "bar"}, handler)


通过返回false来取消默认的行为并阻止事件起泡。

复制代码 代码如下:
$("form").bind("submit", function() { return false; })

bind存在的问题

如果表格中要绑定单击事件的有10列500行,那么查找和遍历5000个单元格会导致脚本执行速度明显变慢,而保存5000个td元素和相应的事件处理程序也会占用大量内存(类似于让每个人亲自站在门口等快递)。

在前面这个例子的基础上,如果我们想实现一个简单的相册应用,每页只显示50张照片的缩略图(50个单元格),用户点击“第x页”(或“下一页”)链接可以通过Ajax从服务器动态加载另外50张照片。在这种情况下,似乎使用.bind()方法为50个单元格绑定事件又可以接受了。

事实却不然。使用.bind()方法只会给第一页中的50个单元格绑定单击事件,动态加载的后续页面中的单元格都不会有这个单击事件。换句话说,.bind()只能给调用它的时候已经存在的元素绑定事件,不能给未来新增的元素绑定事件(类似于新来的员工收不到快递)。

事件委托可以解决上述两个问题。具体到代码上,只要用jQuery 1.3新增的.live()方法代替.bind()方法即可:

复制代码 代码如下:
$("#info_table td").live("click",function(){/*显示更多信息*/});

这里的.live()方法会把click事件绑定到$(document)对象(但这一点从代码中体现不出来,这也是.live()方法饱受诟病的一个重要原因,稍后再详细讨论),而且只需要给$(document)绑定一次(不是50次,更不是5000次),然后就能够处理后续动态加载的照片单元格的单击事件。在接收到任何事件时,$(document)对象都会检查事件类型和事件目标,如果是click事件且事件目标是td,那么就执行委托给它的处理程序。
 
unbind():移除bind进行的绑定。
 
3. live()

到目前为止,一切似乎很完美。可惜,事实并非如此。因为.live()方法并不完美,它有如下几个主要缺点:
$()函数会找到当前页面中的所有td元素并创建jQuery对象,但在确认事件目标时却不用这个td元素集合,而是使用选择符表达式与event.target或其祖先元素进行比较,因而生成这个jQuery对象会造成不必要的开销;
默认把事件绑定到$(document)元素,如果DOM嵌套结构很深,事件冒泡通过大量祖先元素会导致性能损失;
只能放在直接选择的元素后面,不能在连缀的DOM遍历方法后面使用,即$("#info_table td").live...可以,但$("#info_table").find("td").live...不行;
收集td元素并创建jQuery对象,但实际操作的却是$(document)对象,令人费解。
解决之道
为了避免生成不必要的jQuery对象,可以使用一种叫做“早委托”的hack,即在$(document).ready()方法外部调用.live():

复制代码 代码如下:
(function($){ 
    $("#info_table td").live("click",function(){/*显示更多信息*/}); 
})(jQuery);

在此,(function($){...})(jQuery)是一个“立即执行的匿名函数”,构成了一个闭包,可以防止命名冲突。在匿名函数内部,$参数引用jQuery对象。这个匿名函数不会等到DOM就绪就会执行。注意,使用这个hack时,脚本必须是在页面的head元素中链接和(或)执行的。之所以选择这个时机,因为这时候刚好document元素可用,而整个DOM还远未生成;如果把脚本放在结束的body标签前面,就没有意义了,因为那时候DOM已经完全可用了。

为了避免事件冒泡造成的性能损失,jQuery从1.4开始支持在使用.live()方法时配合使用一个上下文参数:

复制代码 代码如下:
$("td",$("#info_table")[0]).live("click",function(){/*显示更多信息*/});

这样,“受托方”就从默认的$(document)变成了$("#info_table")[0],节省了冒泡的旅程。不过,与.live()共同使用的上下文参数必须是一个单独的DOM元素,所以这里指定上下文对象时使用的是$("#info_table")[0],即使用数组的索引操作符来取得的一个DOM元素。 
 
4. delegate()

如前所述,为了突破单一.bind()方法的局限性,实现事件委托,jQuery 1.3引入了.live()方法。后来,为解决“事件传播链”过长的问题,jQuery 1.4又支持为.live()方法指定上下文对象。而为了解决无谓生成元素集合的问题,jQuery 1.4.2干脆直接引入了一个新方法.delegate()。
 
使用.delegate(),前面的例子可以这样写:

复制代码 代码如下:
$("#info_table").delegate("td","click",function(){/*显示更多信息*/});

使用.delegate()有如下优点(或者说解决了.live()方法的如下问题):
直接将目标元素选择符("td")、事件("click")及处理程序与“受拖方”$("#info_table")绑定,不额外收集元素、事件传播路径缩短、语义明确;

支持在连缀的DOM遍历方法后面调用,即支持$("table").find("#info").delegate...,支持精确控制;

可见,.delegate()方法是一个相对完美的解决方案。但在DOM结构简单的情况下,也可以使用.live()。

提示:使用事件委托时,如果注册到目标元素上的其他事件处理程序使用.stopPropagation()阻止了事件传播,那么事件委托就会失效。
 
undelegate(): 移除delegate的绑定

希望本文所述对大家的jQuery程序设计有所帮助。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

BTCC教学:如何在BTCC交易所绑定使用MetaMask钱包? BTCC教学:如何在BTCC交易所绑定使用MetaMask钱包? Apr 26, 2024 am 09:40 AM

MetaMask(中文也叫小狐狸钱包)是一款免费的、广受好评的加密钱包软件。目前,BTCC已支持绑定MetaMask钱包,绑定后可使用MetaMask钱包进行快速登入,储值、买币等,且首次绑定还可获得20USDT体验金。在BTCCMetaMask钱包教学中,我们将详细介绍如何注册和使用MetaMask,以及如何在BTCC绑定并使用小狐狸钱包。MetaMask钱包是什么?MetaMask小狐狸钱包拥有超过3,000万用户,是当今最受欢迎的加密货币钱包之一。它可免费​​使用,可作为扩充功能安装在网络

小红书怎么绑定子账号?它怎么检测账号是否正常? 小红书怎么绑定子账号?它怎么检测账号是否正常? Mar 21, 2024 pm 10:11 PM

在如今这个信息爆炸的时代,个人品牌和企业形象的建设变得越来越重要。小红书作为国内领先的时尚生活分享平台,吸引了大量用户关注和参与。对于那些希望扩大影响力、提高内容传播效率的用户来说,绑定子账号成为了一种有效的手段。那么,小红书怎么绑定子账号呢?又如何检测账号是否正常呢?本文将为您详细解答这些问题。一、小红书怎么绑定子账号?1.登录主账号:首先,您需要登录您的小红书主账号。2.打开设置菜单:点击右上角的“我”,然后选择“设置”。3.进入账号管理:在设置菜单中,找到“账号管理”或“账号助手”选项,点

今日头条中绑定抖音的步骤方法 今日头条中绑定抖音的步骤方法 Mar 22, 2024 pm 05:56 PM

1、打开今日头条。2、点击右下角我的。3、点击【系统设置】。4、点击【账号和隐私设置】。5、点击【抖音】右边的按钮即可绑定抖音。

菜鸟app怎么绑定拼多多 菜鸟裹裹怎么添加拼多多平台 菜鸟app怎么绑定拼多多 菜鸟裹裹怎么添加拼多多平台 Mar 19, 2024 pm 02:30 PM

  菜鸟app就是能够为你们提供出各种物流信息状况的平台,这里的功能非常的强大好用,大家有任何与物流相关的问题,都能在这得到解决的,反正都能为你们带来一站式的服务,全都能及时解决的,查快递,取快递,寄快递等,都是毫无任何问题,与各个的平台都进行了合作,全部的信息,都能查询得到的,但是有些时候会出现拼多多当中购买的商品,都是无法呈现出物流的信息,其实是需要大家进行手动绑定拼多多,才能实现的,具体的方法已经整理出来了在下方,大家都能来看看的。菜鸟绑定拼多多账户的方法:  1、打开菜鸟APP,在主页面

jQuery中如何使用PUT请求方式? jQuery中如何使用PUT请求方式? Feb 28, 2024 pm 03:12 PM

jQuery中如何使用PUT请求方式?在jQuery中,发送PUT请求的方法与发送其他类型的请求类似,但需要注意一些细节和参数设置。PUT请求通常用于更新资源,例如更新数据库中的数据或更新服务器上的文件。以下是在jQuery中使用PUT请求方式的具体代码示例。首先,确保引入了jQuery库文件,然后可以通过以下方式发送PUT请求:$.ajax({u

菜鸟APP怎么绑定拼多多 菜鸟APP绑定拼多多方法 菜鸟APP怎么绑定拼多多 菜鸟APP绑定拼多多方法 Mar 19, 2024 pm 05:16 PM

  你们知道在使用菜鸟裹裹的时候是怎么来绑定拼多多的吗?菜鸟裹裹App官方正版在这款平台上面对于一些拼多多的物流信息是没有自动同步上去的,我们需要做的就只能复制单号过来或者是查询你们的手机看看有无快递的信息。当然这些都是需要手动来完成的,如果你们也想了解更多的话,就和小编一起来看看吧。  菜鸟APP怎么绑定拼多多  1、打开菜鸟APP,在主页面点击左上角的“导包裹”。  2、在界面中,有很多购物网站,账号都可以绑定。  3、点击导入其他电商平台。  4、用户授权:点击拼多多转到界面

小米汽车app怎么绑定充电桩设备 小米汽车app怎么绑定充电桩设备 Apr 01, 2024 pm 06:52 PM

最新小米最新推出的小米su7型号汽车霸占了各种热搜榜,很多正好有购车需求的用户们都纷纷选择了小米su7型号的汽车进行购买,那么在提车以后如何利用自己的小米汽车app绑定家用充电桩进行充电呢,那么这篇教程攻略就将为大家带来详细的内容介绍,希望能帮助到大家。首先我们先打开小米手机app,点击右下角我的按钮然后在我的界面,可以看到家充桩的选项进入到绑定充电桩的页面以后,点击下方的去扫码按钮,扫描充电桩上的二维码即可完成充电桩与app的绑定

小黑盒无法绑定Steam怎么办 小黑盒无法绑定Steam怎么办 Mar 12, 2024 pm 03:10 PM

小黑盒绑定不上Steam可能是网络或软件版本问题所致。小黑盒提供包括已发售和即将发售游戏价格、电脑配置要求与评价、深度玩法解析等信息。此外,它还支持用户随时随地通过移动端查找所需信息。小黑盒无法绑定Steam怎么办1、确认网络状况请确保设备已连接至互联网。2、检查小黑盒版本请确保您使用的是最新版小黑盒软件,并尝试绑定Steam账户。3、查看Steam账户设置请登录Steam账户,查看隐私设置中是否已开启允许第三方软件绑定功能。4、联系官方客服如上述步骤仍无法解决问题,建议您联系官方客服寻求帮助。

See all articles