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 相关文章推荐
jquery imgareaselect 使用利用js与程序结合实现图片剪切
Jul 30 Javascript
DIV外区域Click后关闭DIV的实现代码
Dec 21 Javascript
JavaScript中读取和保存文件实例
May 08 Javascript
ionic 上拉菜单(ActionSheet)实例代码
Jun 06 Javascript
JS使用JSON作为参数实例分析
Jun 23 Javascript
js发送短信倒计时的简单实现方法
Sep 08 Javascript
深入理解选择框脚本[推荐]
Dec 13 Javascript
详解使用angular框架离线你的应用(pwa指南)
Jan 31 Javascript
vue slot与传参实例代码讲解
Apr 28 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
Jun 18 Javascript
深度解读vue-resize的具体用法
Jul 08 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 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
PHP新手上路(十)
2006/10/09 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
解决vue动态下拉菜单 有数据未反应的问题
2020/08/06 Javascript
Webpack的Loader和Plugin的区别
2020/11/09 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
python设计模式大全
2016/06/27 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
浅谈python迭代器
2017/11/08 Python
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
基于python实现把json数据转换成Excel表格
2020/05/07 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
Ibatis如何调用存储过程
2015/05/15 面试题
sort命令的作用和用法
2012/11/04 面试题
广告艺术设计专业自荐书
2014/07/08 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
感谢信
2019/04/11 职场文书
详细介绍python类及类的用法
2021/05/31 Python
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python
鸿蒙3.0体验感怎么样? 鸿蒙3.0系统评测向
2022/08/14 数码科技