[转]jQuery的.live()和.die()
本文转自:http://www.cnblogs.com/dumuqiao/archive/2011/09/09/2172513.html
翻译原文地址:http://www.alfajango.com/blog/exploring-jquery-live-and-die/
很多开发者都知道jQuery的.live()方法,他们大部分知道这个函数做什么,但是并不知道是怎么实现的,所以用的并不那么舒适。而且他们却从未听过还有解除绑定的.live()事件的.die()方法。即使你熟悉这些,但是你意识到.die()了吗?
什么是 .live()
.live方法类似于.bind(),除此之外,它允许你将事件绑定到DOM元素上,可以将事件绑定到DOM中还不存在的元素上,看看下面的例子:
比方说当用户在点击链接时及想提示他们正在离开站点。
1
2
3
4
5
6
|
$(document).ready( function () { $( 'a' ).click( function () { alert( "You are now leaving this site" ); return true ; }); }); |
注意,.click()仅仅是个实现更一般.bind()的简单方法,下面和上面的代码相当于上面的实现。
1
2
3
4
5
6
|
$(document).ready( function () { $( 'a' ).bind( 'click' , function () { alert( "You are now leaving this site" ); return true ; }); }); |
但是现在通过javascript添加一个链接到页面。
1
|
$( 'body' ).append( '<div><a href="...">Check it out!</a></div>' ); |
然而当用户点击那个链接是,方法将不会被调用,因为那个链接当你将click事件绑定到页面的所有<a>节点时还并不存在,所以我们就用.live()替换.bind():
1
2
3
4
5
6
|
$(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()就是类似的关系了。为了解除上面的绑定(不希望用户点击链接时弹出对话框),我们这么做:
1
|
$( 'a' ).die(); |
更具体点,如果还有其他的事件被绑定且需要保留,例如hover或其他,可以只解除click事件绑定。
1
|
$( 'a' ).die( 'click' ); |
再具体些,如果已经定义了方法名,可以解除绑定指定的方法。
1
2
3
4
5
6
7
8
9
10
11
12
|
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()方法中用到的元素选择器,例如,不可以像下面这样写:
1
2
3
4
5
6
7
8
9
10
|
$(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找不到任何绑定去去掉,就不会起作用了。
更糟的是下面这个:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$(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(),它们联系很紧密。
[转]jQuery的.live()和.die()的更多相关文章
- jQuery为哪般去掉了浏览器检测
由于做HTML5相关的项目,许多前卫时髦的前端技术就需要考虑一下IE是否支持.要是在以前,可以很方便地调用jQuery的jQuery.browser来实现. If(jQuery.browser.msi ...
- jQuery中的.live()与die()
翻译原文地址:http://www.alfajango.com/blog/exploring-jquery-live-and-die/ 很多开发者都知道jQuery的.live()方法,他们大部分知道 ...
- 生死相依:说说JQuery中die()、live()详解[翻译]
一个web前端工程师,应该知道jquery的.live()函数,知道它是做什么用的,但是不知它是怎么样工作的,使用起来也是不得得心应手的,甚至也没听说过.die()(去掉bind事件).即使你能熟悉这 ...
- js事件委托和jQuery事件绑定on , off , one , bind , unbind , die
一. 事件委托什么是事件委托?用现实中的理解就是:有100 个学生同时在某天中午收到快递,但这100 个学生不可能同时站在学校门口等,那么都会委托门卫去收取,然后再逐个交给学生.而在jQuery 中, ...
- jquery die()方法 语法
jquery die()方法 语法 作用:die() 方法移除所有通过 live() 方法向指定元素添加的一个或多个事件处理程序.直线电机参数 语法:$(selector).die(event,fun ...
- jquery为什么提倡使用.on绑定,.off移除组合代替.live和.die组合呢?
.live绑定的是固定的Document的节点,在树形节点中,如果节点较多,层级查询影响效率: .on绑定的是$(selector),可自由改变嵌套层级问题,效率高: 列举两种on可以绑定多个事件的方 ...
- jQuery 中bind(),live(),delegate(),on() 区别(转)
当我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 准备知识: 当我们在开始的时候,有些知识是必须具备的: D ...
- 转 jQuery 中bind(),live(),delegate(),on() 区别
当我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 准备知识: 当我们在开始的时候,有些知识是必须具备的: D ...
- jQuery 事件方法
事件方法触发器或添加一个函数到被选元素的事件处理程序. 下面的表格列出了所有用于处理事件的 jQuery 方法. 方法 描述 bind() 向匹配元素附加一个或更多事件处理器 blur() 触发.或将 ...
随机推荐
- Java分层概念(转)
Java分层概念(转) 对于分层的概念,似乎之间简单的三层,多了,就有点难以区分了,所以收藏了这个. ervice是业务层 action层即作为控制器 DAO (Data Access Object) ...
- springMvc参数传递的方法
package cn.edu.hj.controller; import java.util.Map; import javax.servlet.http.HttpServletRequest; im ...
- Git知识点汇总
设置全局用户名 git config --global user.name "yourname" 设置全局邮箱 git config --global user.email &qu ...
- 不应该使用Connected属性作为Socket是否连接上的依据
最近在做一个接口,用到了Socket异步通信. 调试了3天了,一直将Socket的Connected属性作为客户端和服务器端是否连接上的依据.今天发现我错了. 下面是从一个csdn博友写的,很好. h ...
- (转)C# TextBox ReadOnly / Enabled 时,后台无法取值问题
当页面上的某个TextBox 设置了属性ReadOnly = "True" 或 Enabled = "False" 时,在客户端为其赋值后,在后台代码中却无法获 ...
- 【京东助手】滑稽东试用助手 V1.6.0
很久没写博客了,发个最近在做的一个软件! 滑稽东试用助手现有功能1.自动申请试用2.自动领取京豆3.自动签到领取京豆说明:该软件使用C#开发,若要运行此应用程序,您必须首先安装 .NET4.01.双击 ...
- 【转载】在AspNetCore 中 使用Redis实现分布式缓存
原文地址:https://www.cnblogs.com/szlblog/p/9045209.html AspNetCore 使用Redis实现分布式缓存 上一篇讲到了,Core的内置缓存:IMemo ...
- centoOS下安装python3 和 pip: command not found
在更新python3的时候会自动安装pip3,但是安装完成后,pip -V发现出错:command not found,找了好久,发现在建立软连接的时候路径写错了. 总结一下安装python3和发现p ...
- 青橙 A1255. 拉拉队排练(陶文博)
A1255. 拉拉队排练(陶文博) 时间限制:1.0s 内存限制:512.0MB 总提交次数: AC次数: 平均分: 将本题分享到: 查看未格式化的试题 提交 ...
- P4559 [JSOI2018]列队
\(\color{#0066ff}{ 题目描述 }\) 作为一名大学生,九条可怜在去年参加了她人生中的最后一次军训. 军训中的一个重要项目是练习列队,为了训练学生,教官给每一个学生分配了一个休息位置. ...