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 相关文章推荐
原生javascript兼容性测试实例
Jul 01 Javascript
jquery 字符串切割函数substring的用法说明
Feb 11 Javascript
JavaScript实现url参数转成json形式
Sep 25 Javascript
JavaScript 栈的详解及实例代码
Jan 22 Javascript
解决jquery appaend元素中id绑定事件失效的问题
Sep 12 jQuery
详解vue + vuex + directives实现权限按钮的思路
Oct 24 Javascript
使用 Node.js 开发资讯爬虫流程
Jan 07 Javascript
利用vue和element-ui设置表格内容分页的实例
Mar 02 Javascript
JavaScript实现的简单Tab点击切换功能示例
Jul 06 Javascript
vue实现文件上传读取及下载功能
Nov 17 Javascript
layui内置模块layim发送图片添加加载动画的方法
Sep 23 Javascript
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
May 18 Vue.js
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
PHP垃圾回收机制引用计数器概念分析
2013/06/24 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
php正则表达式学习笔记
2015/11/13 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
在JavaScript中访问字符串的子串
2015/07/07 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
js实现放大镜特效
2017/05/18 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python 合并文件的具体实例
2013/08/08 Python
pycharm 配置远程解释器的方法
2018/10/28 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
捷克家电和家具购物网站:OKAY.cz
2020/07/23 全球购物
学生的自我鉴定范文
2013/10/24 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL
javascript对象3个属性特征
2021/11/17 Javascript
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python
尝试使用Python爬取城市租房信息
2022/04/12 Python
教你如何用cmd快速登录服务器
2022/06/10 Servers
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技