jQuery的.live()和.die() 使用介绍

什么是 .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(),它们联系很紧密。

(0)

相关推荐

  • JQuery live函数

    摘自 jQuery 1.4.1 中文参考: 事件委托 .live() 方法能对一个还没有添加进DOM的元素有效,是由于使用了事件委托:绑定在祖先元素上的事件处理函数可以对在后代上触发的事件作出回应.传递给 .live() 的事件处理函数不会绑定在元素上,而是把他作为一个特殊的事件处理函数,绑定在 DOM 树的根节点上.在我们的例子中,当点击新的元素后,会依次发生下列步骤: 生成一个click事件传递给 <div> 来处理 由于没有事件处理函数直接绑定在 <div> 上,所以事件冒泡

  • jQuery live

    也能绑定自定义事件.目前支持 click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup. 还不支持 blur, focus, mouseenter, mouseleave, change, submit 与bind()不同的是,live()一次只能绑定一个事件. 这个方法跟传统的bind很像,区别在于用live来绑定事件会给所有当前以及将来在页面上的元素绑定事件(使用

  • jQuery live( type, fn ) 委派事件实现

    目前支持 click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup. 还不支持 blur, focus, mouseenter, mouseleave, change, submit 与bind()不同的是,live()一次只能绑定一个事件. 这个方法跟传统的bind很像,区别在于用live来绑定事件会给所有当前以及将来在页面上的元素绑定事件(使用委派的方式).比如说

  • jquery(live)中File input的change方法只起一次作用的解决办法

    错误写法 复制代码 代码如下: $("#uploadImg").click(function(){ do something }); 正确写法 复制代码 代码如下: $("#uploadImg").live('change',function(){ do something });

  • jQuery中的.bind()、.live()和.delegate()之间区别分析

    DOM树 首先,可视化一个HMTL文档的DOM树是很有帮助的.一个简单的HTML页面看起来就像是这个样子: 事件冒泡(又称事件传播) 当我们点击一个链接时,其触发了链接元素的单击事件,该事件则引发任何我们已绑定到该元素的单击事件上的函数的执行. 复制代码 代码如下: $('a').bind('click',function(){alert('that tickles!')}) 因此一个单击操作会触发alert函数的执行. click事件接着会向树的根方向传播,广播到父元素,然后接着是每个祖先元素

  • jQuery中live方法的重复绑定说明

    解决:使用die()方法,在live()方法绑定前,将此元素上的前面被绑定的事件统统解除,然后再通过live()方法绑定新的事件. 复制代码 代码如下: //先通过die()方法解除,再通过live()绑定 $("#selectAll").die().live("click",function(){ //事件运行代码 }); die()方法简介: 复制代码 代码如下: die([type], [fn])<SPAN style="WHITE-SPACE

  • Windows Live Writer 实现代码高亮

    为了实现代码高亮,之前找了很多插件,但是效果都不是很理想.经过研究终于找到一个完美的解决方案,这个解决方案具有如下优点: 代码简洁,用<pre>标签实现代码高亮,不会生成太多Html标签. 支持多种语言,包括c#,c++,php,python等10多种语言. 扩充方便,可以通过简单二次开发实现对其它语言的支持. 使用方便,把代码复制到代码高亮转换窗口即可. 下面一步步介绍如何配置WLW+wordpress的代码高亮解决方案: 1.准备工作: 下载 precode code snippet ma

  • JQuery下的Live方法和$.browser方法使用代码

    复制代码 代码如下: $(function(){ Ajaxload("?Uid=1<%= Yan.GET_Dict(id, 8, TableName)%>") $("#ThreeM a:first").addClass("addBg"); $(".pageP2 a").live("click",function(){var NewUrl=$(this).attr("href"

  • jQuery的.live()和.die() 使用介绍

    什么是 .live() .live方法类似于.bind(),除此之外,它允许你将事件绑定到DOM元素上,可以将事件绑定到DOM中还不存在的元素上,看看下面的例子: 比方说当用户在点击链接时及想提示他们正在离开站点. 复制代码 代码如下: $(document).ready( function() { $('a').click( function() { alert("You are now leaving this site"); return true; }); }); 注意,.cl

  • jQuery常见的选择器及用法介绍

    选择器的意义就是将众多html代码中准确的找出我们想找的单元. 接下来将常见的选择器以及作用列举出来. 基本选择器 $('#test1').css('background' , 'gray'); 可以找到id = test1的单元. $('p').css('background' , 'blue'); 所有的P标签都会被选中. $('.test2').css('background' , 'green'); Class = test2的单元全部被选中. $('*').css('backgroun

  • jQuery中 bind的用法简单介绍

    bind介绍 bind() 方法为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数. 语法 $(selector).bind(event,data,function) event 必须.添加到元素的一个或多个事件如:click,mouseover,mouseup,change,select data 可不填.传递到函数的额外数据,如:$(selector).bind("click","input",function(){}); function(){}

  • JQuery入门—JQuery程序的代码风格详细介绍

    <jQuery权威指南>第1章jQuery开发入门,本章通过循续渐进的方式,先从jQuery的基础概念入手,介绍jQuery库的下载,引入简单应用方法:后部分侧重于jQuery控制DOM对象和页面CSS样式的介绍,通过一些简单的小示例,使读者对jQuery在页面中的功能应用有一个大致的了解,为下一章节进一步学习jQuery库的详细对象和方法奠定基础.本节为大家介绍jQuery程序的代码风格. 1.1.5 jQuery程序的代码风格 1."$"美元符的使用 在jQuery程序

  • jQuery拖拽 & 弹出层 介绍与示例

    iDrag & iDialog 介绍特点:iDialog.js依赖于jquery编写的简单易用的对话框,同时还可以通过添加css3,改变对话框的展现动画.提供了两个方法: •1.拖拽函数 iDrag() 或 $.drag();•2.对话框函数 iDialog() 或 $.dialog(); 跨平台兼容:兼容:IE6+.Firefox.Chrome等主流浏览器(其它暂时没条件测试).并且IE6下也能支持现代浏览器的静止定位(fixed).覆盖下拉控件. 渐进增强的体验:确保IE家族功能完善的前提下

  • Jquery 数据选择插件Pickerbox使用介绍

    该插件就是为此而生,所以就写了一个. 不过目前并不支持IE6浏览器. 希望大家能多多指教. :) pickerbox 1.0 介绍 pickerbox简称采摘盒子,是基于Jquery的插件,同时也依赖了Ztree3.2,Easyui1.26,及AsyncBox1.4.5.主要为了解决选择多条件的数据. -封装主要插件复杂的使用,关心主要的常用使用. -支持树,导航导向呈现数据. -支持跨iframe获取数据. -灵活支持记录数据. -提供重要事件回调. -兼容IE8以上浏览器. 由于多个插件集成

  • jquery JSON的解析方式示例介绍

    这里考虑都考虑的是服务器返回的是JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明. 这里首先给出JSON字符串集,字符串集如下: var data=" { root: [ {name:'1',value:'0'}, {name:'6101',value:'西安市'}, {name:'6102',value:'铜川市'}, {name:'6103',value:'宝鸡市'}, {name:'6104',value:'咸阳市'}, {

  • jQuery过滤选择器:not()方法使用介绍

    jQuery(':not(selector)') 在jQuery的早期版本中,:not()筛选器只支持简单的选择器,说明我们传入到:not这个filter中的selector可以任意复杂,比如:not(div a) and :not(div,a) 复制代码 代码如下: <p >"a">sdfsdfs</p> <p >"b">sdfsdfs</p> <p >"c">sdf

  • jquery.ajax之beforeSend方法使用介绍

    常见的一种效果,在用ajax请求时,没有返回前会出现前出现一个转动的loading小图标或者"内容加载中..",用来告知用户正在请求数据.这个就可以用beforeSend方法来实现. 下载demo:ajax loading 代码如下: 复制代码 代码如下: function test_ajax(){    $.ajax(    {       type:"GET",//通常会用到两种:GET,POST.默认是:GET       url:"a.php&qu

  • jQuery.Validate验证库的使用介绍

    jQuery.Validate验证库1.下载jquery.validate,这里我提供jquery-validation-1.9.0,点击下载 默认校验规则 复制代码 代码如下: (1)required:true               必输字段(2)remote:"check.php"          使用ajax方法调用check.php验证输入值(3)email:true                  必须输入正确格式的电子邮件(4)url:true          

随机推荐