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 相关文章推荐
33个优秀的 jQuery 图片展示插件分享
Mar 14 Javascript
js replace替换所有匹配的字符串
Feb 13 Javascript
angularJS 中input示例分享
Feb 09 Javascript
Js与Jq获取浏览器和对象值的方法
Mar 18 Javascript
Vue生命周期示例详解
Apr 12 Javascript
js实现分页功能
May 24 Javascript
JS如何实现动态添加的元素绑定事件
Nov 12 Javascript
使用js实现单链解决前端队列问题的方法
Feb 03 Javascript
jQuery实现聊天对话框
Feb 08 jQuery
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 Javascript
JS变量提升原理与用法实例浅析
May 22 Javascript
vue实现分页的三种效果
Jun 23 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
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
PHP耦合设计模式实例分析
2018/08/08 PHP
js压缩利器
2007/02/20 Javascript
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
javascript 获取表单file全路径
2009/12/31 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
js实现单张图片平移切换效果
2017/10/11 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
python实现class对象转换成json/字典的方法
2016/03/11 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
解决python3 Pycharm上连接数据库时报错的问题
2018/12/03 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
html5中使用hotcss.js实现手机端自适配的方法
2020/04/23 HTML / CSS
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
学前班教师的自我鉴定
2013/12/05 职场文书
采购主管的岗位职责
2013/12/17 职场文书
三查三看党性分析材料
2014/02/18 职场文书
语文教育专业求职信
2014/06/28 职场文书
委托代理人授权委托书范本
2014/09/24 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
优秀员工事迹材料
2014/12/20 职场文书
优秀团员个人总结
2015/02/26 职场文书
运动会主持词大全
2015/07/02 职场文书
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python