Jquery绑定事件(bind和live的区别介绍)


Posted in Javascript onAugust 23, 2013

Jquery中绑定事件有三种方法:以click事件为例

(1)target.click(function(){});

(2)target.bind("click",function(){});

(3)target.live("click",function(){});

第一种方法很好理解,其实就和普通JS的用法差不多,只是少了一个on而已

第二、三种方法都是绑定事件,但是二者又有很大的不同,下面着重讲解一下,因为这个如果用到Jquery的框架的话是用的挺多的,尤其要注意二者的区别。

【bind和live的区别】

live方法其实是bind方法的变种,其基本功能就同bind方法的功能是一样的,都是为一个元素绑定某个事件,但是bind方法只能给当前存在的元素绑定事件,对于事后采用JS等方式新生成的元素无效,而live方法则正好弥补了bind方法的这个缺陷,它可以对后生成的元素也可以绑定相应的事件。那么live方法的这个特性是怎么实现的呢?下面来探讨一下其实现原理。

live方法之所以能对后生成的元素也绑定相应的事件的原因归结在“事件委托”上面,所谓“事件委托”就是指绑定在祖先元素上的事件可以在其后代元素上进行使用。live方法的处理机制就是把事件绑定在DOM树的根节点上,而不是直接绑定在某个元素上。举一个例子来说明:

$(".clickMe").live("click",fn); 
$("body").append("<div class='clickMe'>测试live方法的步骤</div>");

当我们点击这个新增的元素时会依次发生如下步骤:

(1)生成一个click事件,传递给div来做处理

(2)由于没有事件直接绑定在div上,所以事件直接冒泡到DOM树上

(3)事件不断冒泡,直到DOM树的根节点上,默认情况下,根节点上就绑定了这个click事件

(4)执行由live绑定的click事件

(5)检测绑定事件的对象是否存在,判断是否需要继续执行绑定的事件。检测事件对象是通过检测

$(event.target).closest('.clickMe') 能否找到匹配的元素来实现的。

(6)通过(5)的测试,如果绑定事件的对象存在的话,就执行绑定的事件。

由于只有在事件发生的时候,live方法才会去检测绑定事件的对象是否存在,所以live方法可以实现后来新增的元素也可实现事件的绑定。相比之下,bind会在事件在绑定阶段就会判断绑定事件的元素是否存在,而且只针对当前元素进行绑定,而不是绑定到父节点上。

根据上面的分析,live的好处真是很大,那么为什么还要使用bind方法呢?之所以jquery要保留bind方法而不是采用live方法去替代bind,也是因为live在某些情况下是不能够完全替代bind的。主要的不同如下:

(1)bind方法可以绑定任何JavaScript的事件,而live方法在jQuery1.3的时候只支持click, dblclick, keydown, keypress,keyup,mousedown, mousemove, mouseout, mouseover, 和 mouseup.在jQuery 1.4.1中,甚至也支持 focus 和 blue

事件了(映射到更合适,并且可以冒泡的focusin和focusout上)。另外,在jQuery 1.4.1中,也能支持hover(映射到"mouseenter mouseleave")。

(2)live() 并不完全支持通过DOM遍历的方法找到的元素。取而代之的是,应当总是在一个选择器后面直接使用 .live()方法。

(3)当一个元素采用live方法进行事件的绑定的时候,如果想阻止事件的传递或冒泡,就要在函数中return false,仅仅调用stopPropagation()是无法实现阻止事件的传递或者冒泡的

Javascript 相关文章推荐
通过Mootools 1.2来操纵HTML DOM元素
Sep 15 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
Jun 15 Javascript
js加密解密字符串可自定义密码因子
May 13 Javascript
jQuery知识点整理
Jan 30 Javascript
jQuery实现contains方法不区分大小写的方法
Feb 13 Javascript
JavaScript代码实现图片循环滚动效果
Mar 19 Javascript
jquery对象和DOM对象的相互转换详解
Oct 18 Javascript
jquery mobile移动端幻灯片滑动切换效果
Apr 15 Javascript
Bootstrap导航中表单简单实现代码
Mar 06 Javascript
详解用webpack2搭建angular2的项目
Jun 22 Javascript
JavaScript实现带有子菜单和控件的slider轮播图效果
Nov 01 Javascript
Vue.JS项目中5个经典Vuex插件
Nov 28 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
Aug 23 #Javascript
高效率JavaScript编写技巧整理
Aug 23 #Javascript
处理及遍历XML文档DOM元素属性及方法整理
Aug 23 #Javascript
JavaScript语言核心数据类型和变量使用介绍
Aug 23 #Javascript
Javascript表格翻页效果实现思路及代码
Aug 23 #Javascript
jquery $.each() 使用小探
Aug 23 #Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
Aug 23 #Javascript
You might like
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
Linux下将excel数据导入到mssql数据库中的方法
2010/02/08 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
浅谈Sizzle的“编译原理”
2015/04/14 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
Python zip()函数用法实例分析
2018/03/17 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
思想政治自我鉴定
2013/10/06 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript