jQuery的.live()和.die() 使用介绍


Posted in Javascript onSeptember 10, 2011

什么是 .live()
.live方法类似于.bind(),除此之外,它允许你将事件绑定到DOM元素上,可以将事件绑定到DOM中还不存在的元素上,看看下面的例子:

比方说当用户在点击链接时及想提示他们正在离开站点。

$(document).ready( function() { 
$('a').click( function() { 
alert("You are now leaving this site"); 
return true; 
}); 
});

注意,.click()仅仅是个实现更一般.bind()的简单方法,下面和上面的代码相当于上面的实现。
$(document).ready( function() { 
$('a').bind( 'click', function() { 
alert("You are now leaving this site"); 
return true; 
}); 
});

但是现在通过javascript添加一个链接到页面。
$('body').append('<div><a href="...">Check it out!</a></div>');

然而当用户点击那个链接是,方法将不会被调用,因为那个链接当你将click事件绑定到页面的所有<a>节点时还并不存在,所以我们就用.live()替换.bind():
$(document).ready( function() { 
$('a').live( 'click', function() { 
alert("You are now leaving this site"); 
return true; 
}); 
});

现在如果你添加一个新的链接到页面上,绑定就也可以运行了。

.live() 如何工作
.live()背后神奇的地方就在于它并不将事件绑定到你选定的elements上,而实际上是绑定到了DOM树的跟节点(例子中是$(document)),而是在element中就像一个参数一样进行传递。

那么当你点击一个元素时,click事件就会在DOM树上往上传递,直至到达根节点。这个.click()事件的触发器已经在根节点被.live()创建。这个触发方法将首先检测被点击的目标看是否和.live()调用的选择器相匹配。所以上面的例子中,会检查点击的元素是否和$('a').live()中的$('a')相匹配,如果匹配,那么绑定的方法就会执行了。

因为不管你在根节点内点击了什么,根节点的.click()事件都会被触发,当你点击加入到根节点的任何元素时这个检查都会发生。

所有.live() 都可以.die()
如果你知道.bind(),那么你肯定知道.unbind()。那么,.die()和.live()就是类似的关系了。为了接触上面的绑定(不希望用户点击链接时弹出对话框),我们这么做:

$('a').die();

更具体点,如果还有其他的事件被绑定且需要保留,例如hover或其他,可以只解除click事件绑定。

$('a').die('click');

再具体些,如果已经定义了方法名,可以解除绑定指定的方法。

specialAlert = function() { 
alert("You are now leaving this site"); 
return true; 
} 
$(document).ready( function() { 
$('a').live( 'click', specialAlert ); 
$('a').live( 'click', someOtherFunction ); 
}); 
// then somewhere else, we could unbind only the first binding 
$('a').die( 'click', specialAlert );

关于 .die()的问题
使用这些函数时,.die()方法会有一个缺点。只可以使用.live()方法中用到的元素选择器,例如,不可以像下面这样写:
$(document).ready( function() { 
$('a').live( 'click', function() { 
alert("You are now leaving this site"); 
return true; 
}); 
}); 
// it would be nice if we could then choose specific elements 
// to unbind, but this will do nothing 
$('a.no-alert').die();

.die()事件看起来好像是匹配到了目标选择权并解除了.live()的绑定,但事实上,$('a.no-alert')并不存在绑定,所以jquery找不到任何绑定去去掉,就不会起作用了。
更糟的是下面这个:
$(document).ready( function() { 
$('a,form').live( 'click', function() { 
alert("You are going to a different page"); 
return true; 
}); 
}); 
// NEITHER of these will work 
$('a').die(); 
$('form').die(); 
// ONLY this will work 
$('a,form').die();

如何修复 .die()

在我下篇文章中,我将会建议一种.die()执行的新方法,它可以提供一个向后兼容的语气的行为。或许我有时间的话会去建议jQuery核心开发团队在下一个release中接受我的建议并进行修改,希望多一点我刚写的这些方法,包括可选的context参数,允许自定义事件附加的节点,而不是根节点。

如果想得到更多的信息和例子,可以查查jQuery .live() and .die().的文档

同时注意下 .delegate() 和.undelegate(),他们可以替代.live()和.die(),它们联系很紧密。

Javascript 相关文章推荐
textarea的value是html文件源代码,存成html文件的代码
Apr 20 Javascript
百度 popup.js 完美修正版非常的不错 脚本之家推荐
Apr 17 Javascript
javaScript 利用闭包模拟对象的私有属性
Dec 29 Javascript
JavaScript中调用函数的4种方式代码实例
Jul 08 Javascript
基于jquery实现简单的手风琴特效
Nov 24 Javascript
原生js编写autoComplete插件
Apr 13 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
Mar 30 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
Jun 01 Javascript
Javascript作用域和作用域链原理解析
Mar 03 Javascript
Vue组件为什么data必须是一个函数
Jun 11 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
Jun 15 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
Aug 14 Javascript
jquery tab插件精简版分享
Sep 10 #Javascript
javascript语言结构小记(一)
Sep 10 #Javascript
JavaScript高级程序设计 客户端存储学习笔记
Sep 10 #Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
Sep 10 #Javascript
JavaScript高级程序设计 事件学习笔记
Sep 10 #Javascript
JavaScript高级程序设计 XML、Ajax 学习笔记
Sep 10 #Javascript
JavaScript高级程序设计 DOM学习笔记
Sep 10 #Javascript
You might like
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
PHP在线生成二维码代码(google api)
2013/06/03 PHP
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
PHP中Enum(枚举)用法实例详解
2015/12/07 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
文本框input聚焦失焦样式实现代码
2012/10/12 Javascript
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
JavaScript实现单例模式实例分享
2017/12/22 Javascript
vue实现点击关注后及时更新列表功能
2018/06/26 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
python将list转为matrix的方法
2018/12/12 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
Python实现对adb命令封装
2020/03/06 Python
比利时香水网上商店:NOTINO
2018/03/28 全球购物
广告学专业毕业生自荐信
2013/09/24 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
毕业横幅标语
2014/10/08 职场文书
2019新员工心得体会
2019/06/25 职场文书
详解JS ES6编码规范
2021/05/07 Javascript