完美的jquery事件绑定方法on()
在讲on()方法之前,我们先讲讲在on()方法出现前的那些事件绑定方法:
.live()
jQuery 1.3新增的live()方法,使用方法例如以下:
$("#info_table td").live("click",function(){/*显示很多其它信息*/});
这里的.live()方法会把click事件绑定到$(document)对象,并且仅仅须要给$(document)绑定一次,然后就行处理兴许动态载入的单元格的单击事件。
在接收到不论什么事件时。$(document)对象都会检查事件类型和事件目标,假设是click事件且事件目标是td。那么就运行托付给它的处理程序。
到眼下为止,一切似乎非常完美。可惜,事实并不是如此。由于.live()方法并不完美。它有例如以下几个主要缺点:
- $()函数会找到当前页面中的全部td元素并创建jQuery对象。但在确认事件目标时却不用这个td元素集合,而是使用选择符表达式与event.target或其祖先元素进行比較,因而生成这个jQuery对象会造成不必要的开销。
- 默认把事件绑定到$(document)元素,假设DOM嵌套结构非常深,事件冒泡通过大量祖先元素会导致性能损失;
- 仅仅能放在直接选择的元素后面,不能在连缀的DOM遍历方法后面使用,即$("#infotable td").live...能够,但$("#infotable").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)变成了$("#infotable")[0]。节省了冒泡的旅程。
只是,与.live()共同使用的上下文參数必须是一个单独的DOM元素,所以这里指定上下文对象时使用的是$("#infotable")[0],即使用数组的索引操作符来取得的一个DOM元素。
.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()阻止了事件传播,那么事件托付就会失效。
在下列情况下。应该使用.live()或.delegate()。而不能使用.bind():
- 为DOM中的非常多元素绑定同样事件;
- 为DOM中尚不存在的元素绑定事件;
.on()
依据jQuery
1.7 Beta 1的发版说明,jQuery 1.7为了解决.bind()、.live()和.delegate()并存造成的不一致性问题,将会添加一对新的事件方法:.on()和.off(),下面为on()的实现方式:
.on( events [, selector ] [, data ], handler(eventObject) )
一个简单的事件绑定如 $('button').on('click',function(){}); 与bind()无二样。
在须要为较多的元素绑定事件的时候。优先考虑事件托付,能够带来性能上的优点。比方:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
结果:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
如上图,将click事件绑定在document对象上,页面上不论什么元素发生的click事件都冒泡到document对象上得到处理。
注意到.on()的描写叙述中第二个可选參数:selector。例如以下图,加入了第二个參数,选择符button:
结果:
当事件冒泡到document对象时,检測事件的target,假设与传入的选择符(这里是button)匹配,就触发事件。否则不触发。
注意.on()也能够接收一个对象參数,该对象的属性是事件类型,属性值为事件处理函数。
最后有一点,原先的live()方法,处理函数是默认绑定在document对象上不能变的,假设DOM嵌套结构非常深,事件冒泡通过大量祖先元素会导致较大的性能损失。而使用.on()方法,事件仅仅会绑定到$()函数的选择符表达式匹配的元素上(上面我的样例中。为了简单绑定到了document)。因此能够精确地定位到页面中的一部分,而事件冒泡的开销也能够降低。
delegate()与on()同理,毕竟是用on()实现的:
.on()和.off():实现方式
$(elems).on(events, selector, data, fn);
$(elems).off(events, selector, fn);
假设指定selector。则为事件托付;否则,就是常规绑定。
完美的jquery事件绑定方法on()的更多相关文章
- jQuery事件绑定方法bind、 live、delegate和on的区别
我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 1.准备知识 当我们在开始的时候,有些知识是必须具备的: 1 ...
- jQuery中的事件绑定方法
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
- 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别
一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...
- jQuery事件绑定和委托实例
本文实例讲述了jQuery事件绑定和委托.分享给大家供大家参考.具体方法如下: jQuery事件的绑定和委托可以用多种方法实现,on() . bind() . live() . delegate ...
- 深入学习jQuery事件绑定
× 目录 [1]bind [2]trigger [3]delegate[4]on[5]one 前面的话 javascript有HTML.DOM0级.DOM2级和IE这四种事件处理程序,而jQuery对 ...
- 关于JQuery的绑定方法
从jQuery1.7开始,jQuery引入了全新的事件绑定机制,on()和off()两个函数统一处理事件绑定.因为在此之前有bind(), live(), delegate()等方法来处理事件绑定,j ...
- jQuery 事件绑定 和 JavaScript 原生事件绑定
总结一下:jQuery 事件绑定 和 JavaScript 原生事件绑定 及 区别 jQuery 事件绑定 jQuery 中提供了四种事件监听绑定方式,分别是 bind.live.delegate.o ...
- jQuery事件委托方法 bind live delegate on
1.bind jquery 1.3之前 定义和用法:主要用于给选择到的元素上绑定特定事件类型的监听函数 语法: bind(type,[data],function(e)); 特点: a.适合页 ...
- JQuery事件绑定,bind与on区别
jquery事件绑定bind:向匹配元素添加一个或多个事件处理器 $(selector).bind("click",data,function); live:向当前或未来的匹配元素 ...
随机推荐
- bq25896 charging status CHRG_STAT register 0xB
condition 1 : adapter 全部電流往 system去, battery current 也往 system ...
- html css的简单学习(三)
html css的简单学习(三) 前端开发工具:Dreamweaver.Hbuilder.WebStorm.Sublime.PhpStorm...=========================== ...
- mysql利用sql脚本插入数据中文乱码
将其中的 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SE ...
- 嗅探X-Windows服务按键工具xspy
嗅探X-Windows服务按键工具xspy X-Windows完整名字是X Windows图形用户接口.它是一种计算机软件系统和网络协议.它为联网计算机提供了一个基础的图形用户界面(GUI)和丰富 ...
- ubuntu网络、包管理、工作内容小结
中国地图 1.配置IP cat /etc/network/interfaces auto lo iface lo inet loopback # The loopback network interf ...
- Failed to check the status of the service报错解决
报这个错误是因为我的application_context.service.xml 文件里的的dubbo声明暴露口时的ref属性写错了. <dubbo:service interface=&qu ...
- rocketMq---------相关命令
搭建就不详细说了,cent7.x的系统,openJdk8,maven3.x,gradle4.10.2, git 1.8.3.1 直接下载相关的二进制压缩包,解压即用,方便. 下面看常用的管理命令 ro ...
- C#制作、打包、签名、发布Activex全过程【转】
http://www.cnblogs.com/still-windows7/p/3148623.html 一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调用,单单依靠H ...
- Spring HTTP Service
基于Spring MVC, 使用Http Service Invoke远程调用方法 (参考: http://blog.csdn.net/hanqunfeng/article/details/43031 ...
- Linux 软件大全
应用 音频 Airtime - Airtime 是一款用于调度和远程站点管理的开放广播软件 Ardour - 在 Linux 上录音,编辑,和混音 Audacious - 开源音频播放器,按你想 ...