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 相关文章推荐
JS实现超简单的仿QQ折叠菜单效果
Sep 21 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
Sep 14 Javascript
AngularJS控制器之间的通信方式详解
Nov 03 Javascript
关于jQuery.ajax()的jsonp碰上post详解
Jul 02 jQuery
jQuery初级教程之网站品牌列表效果
Aug 02 jQuery
axios post提交formdata的实例
Mar 16 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
Oct 12 Javascript
微信小程序带动画弹窗组件使用方法详解
Nov 27 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
Nov 10 Javascript
小程序实现录音上传功能
Nov 22 Javascript
Element中Slider滑块的具体使用
Jul 29 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不用正则采集速度探究总结
2008/03/24 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
vue实现倒计时获取验证码效果
2020/04/17 Javascript
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
解析Python编程中的包结构
2015/10/25 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
python读写csv文件的方法
2019/08/13 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
深入浅析Python代码规范性检测
2020/07/31 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
2021/01/06 Python
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
西安当代医院管理研究院笔试题
2015/12/11 面试题
医学类导师推荐信范文
2013/11/19 职场文书
农业项目建议书
2014/08/25 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
2016年情人节问候语
2015/11/11 职场文书