[转]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全栈day07---Eclipse开发工具 超市库存管理系统
前六天我们都是用Notepad++来编写java程序,通过DOS命令来运行,我们发现这样比较繁琐,那么我们今天就用一个工具Eclipse来开发java Eclipse的下载安装 * A: Eclips ...
- 《Maven实战》笔记-7-持续集成
一.持续集成的步骤: 1.持续编译 2.持续数据库集成 3.持续测试 4.持续审查 5.持续部署 6.持续反馈 二.持续集成工具——Hudson 1.安装Hudson 2.准备Subversion ...
- 解决ScrollView嵌套viewpager滑动事件冲突问题
重写ScrollView 第一种方案能解决viewpager的滑动问题,但是scrollView有时会滑不动 public class VerticalScrollView extends Scrol ...
- [学习笔记]fork写实复制
#include<stdio.h> #include<stdlib.h> #include<string.h> #include <unistd.h> ...
- 树莓派(Raspberry Pi 3) 使用wifi模块连接网络
树莓派3B内置了wifi和蓝牙模块,启动WIFI模块有两种方式,一种是图形界面,一种是命令行模式. 使用图形界面: 在桌面右上角的菜单栏里面选择wifi,输入密码就可以了. 使用命令行: 第一步:配置 ...
- wget下载jdk 蛋疼问题
wget --no-check-certificate --no-cookies --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com% ...
- c#设计模式-单例模式【转】
单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题 public class Singleton { private static Singleton _instance = ...
- Unity苹果(iOS)内购接入(Unity内置IAP)
https://www.jianshu.com/p/4045ebf81a1c Unity苹果(iOS)内购接入(Unity内置IAP) Kakarottog ...
- 【51nod1847】奇怪的数学题(Min_25筛+杜教筛)
题面 传送门 题解 这题有毒--不知为啥的错误调了半天-- 令\(f(i)={sgcd(i)}\),那么容易看出\(f(i)\)就是\(i\)的次大质因子,用\(i\)除以它的最小质因子即可计算 于是 ...
- css边跨实例
<!doctype html><html lang="zh-cn"> <head> <meta http-equiv="Cont ...