jQuery live()

概述

jQuery 给所有匹配的元素附加一个事件处理函数,即使这个元素是以后再添加进来的也有效。

这个方法是基本是的 .bind() 方法的一个变体。使用 .bind() 时,选择器匹配的元素会附加一个事件处理函数,而以后再添加的元素则不会有。为此需要再使用一次 .bind() 才行。比如说

<body>
  <div class="clickme">Click here</div>
</body>

可以给这个元素绑定一个简单的click事件:

$('.clickme').bind('click', function() {
  alert("Bound handler called.");
});

当点击了元素,就会弹出一个警告框。然后,想象一下这之后有另一个元素添加进来了。

$('body').append('<div class="clickme">Another target</div>');

尽管这个新的元素也能够匹配选择器 ".clickme" ,但是由于这个元素是在调用 .bind() 之后添加的,所以点击这个元素不会有任何效果。

.live() 就提供了对应这种情况的方法。如果我们是这样绑定click事件的:

$('.clickme').live('click', function() {
  alert("Live handler called."); 
});

然后再添加一个新元素:

$('body').append('<div class="clickme">Another target</div>');

然后再点击新增的元素,他依然能够触发事件处理函数。

事件委托

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

  1. 生成一个click事件传递给 来处理
  2. 由于没有事件处理函数直接绑定在 <divgt; 上,所以事件冒泡到DOM树上
  3. 事件不断冒泡一直到DOM树的根节点,默认情况下上面绑定了这个特殊的事件处理函数。
  4. 执行由 .live() 绑定的特殊的 click 事件处理函数。
  5. 这个事件处理函数首先检测事件对象的 target 来确定是不是需要继续。这个测试是通过检测 $(event.target).closest('.clickme') 能否找到匹配的元素来实现的。
  6. 如果找到了匹配的元素,那么调用原始的事件处理函数。

由于只有在事件发生时才会在上面的第五步里做测试,因此在任何时候添加的元素都能够响应这个事件。

附加说明

.live() 虽然很有用,但由于其特殊的实现方式,所以不能简单的在任何情况下替换 .bind()。主要的不同有:

  • 在jQuery 1.4中,.live()方法支持自定义事件,也支持所有的 JavaScript 事件。在jQuery 1.4.1中,甚至也支持 focus 和 blue 事件了(映射到更合适,并且可以冒泡的focusin和focusout上)。另外,在jQuery 1.4.1中,也能支持hover(映射到"mouseenter mouseleave")。然而在jQuery 1.3.x中,只支持支持的JavaScript事件和自定义事件:click, dblclick, keydown, keypress, keyup, mousedown, mousemove, mouseout, mouseover, 和 mouseup.
  • .live() 并不完全支持通过DOM遍历的方法找到的元素。取而代之的是,应当总是在一个选择器后面直接使用 .live() 方法,正如前面例子里提到的。
  • 当一个事件处理函数用 .live() 绑定后,要停止执行其他的事件处理函数,那么这个函数必须返回 false。 仅仅调用 .stopPropagation() 无法实现这个目的。

参考 .bind() 方法可以获得更多关于事件绑定的信息。

在jQuery 1.4.1 中,.live() 能接受多个,用空间分隔事件,在提供类似.bind()的功能 。例如,我们可以“live ” 同时绑定mouseover和mouseout事件,像这样:

$('.hoverme').live('mouseover mouseout', function(event) {
  if (event.type == 'mouseover') {
    // do something on mouseover
  } else {
    // do something on mouseout
  }
});

在jQuery 1.4.3中:你可以绑定一个或多个事件类型的字符串和函数的数据映射来执行他们

$("a").live({
  click: function() {
    // do something on click
  },
  mouseover: function() {
    // do something on mouseover
  }
});

在jQuery 1.4 中,data参数可以用于把附加信息传递给事件处理函数。一个很好的用处是应付由闭包导致的问题。可以参考 .bind() 的讨论来获得更多信息。

在jQuery 1.4 中, live事件可以绑定到“context”DOM元素,而不是默认的文档的根。要设置此背景下,我们通过在一个单一的DOM元素(而不是一个jQuery集合或选择器)使用jQuery() function's second argument。

$('div.clickme', $('#container')[0]).live('click', function() {
  // Live handler called.
});

从 jQuery 1.7 开始,不再建议使用 .live() 方法。请使用 .on() 来添加事件处理。使用旧版本的用户,应该优先使用 .delegate() 来替代 .live()。

参数

type,[fn]String,FunctionV1.3

type:一个或多个事件类型,由空格分隔多个事件。

fn:要从每个匹配元素的事件中反绑定的事件处理函数

type,[data],falseString,Array,boolV1.4

type:一个或多个事件类型,由空格分隔多个事件。

data:传递给事件处理函数的附加参数

false:设置为false会使默认的动作失效。

eventStringV1.4.3

一个或多个事件类型的字符串和函数的数据映射来执行他们

示例

描述:

点击生成的p依然据有同样的功能。

HTML 代码:
<p>Click me!</p>
jQuery 代码:
$("p").live("click", function(){
    $(this).after("<p>Another paragraph!</p>");
});

描述:

阻止默认事件行为和事件冒泡,返回 false

jQuery 代码:
$("a").live("click", function() { return false; });

描述:

仅仅阻止默认事件行为

jQuery 代码:
$("a").live("click", function(event){
  event.preventDefault();
});
感谢阅读:jQuery live(),欢迎收藏【jQuery live()】,以便下次访问。
12个常用的jQuery代码片段

在《锋利的jQuery》中整理的几个现在还常用的jQuery代码片段。1.禁用页面,禁用页面的右键菜单//禁用右键菜单$(document)...4月23日

jQuery选择器Sizzle原理分析(下)

的jQuery还记得吗?拥有号称当时业界最快的DOM选择器Sizzle,那么为什么他能自称是最快呢?让我们来分析一下Sizzle.js的源码,了解他的设计精妙之处...4月20日

10款强大的jQuery/HTML5应用新鲜出炉

今天我们来分享10款最新的jQuery和HTML5应用插件,都非常强大,一起来看看吧。1...5月11日

锋利的jQuery

本书循序渐进地对jQuery的各种函数和方法调用进行了介绍,读者可以系统地掌握jQuery的DOM操作、事件监听和动画、表单操作、AJAX以及插件方面等知识点...5月8日

前端基础进阶(十一):详细图解jQuery对象,以及如何扩展jQuery插件

大家都非常热衷于研究jQuery源码。我还记得当初从jQuery源码中学到一星半点应用技巧的时候常会有一种发自内心的惊叹,...4月2日

外媒速递:五款jQuery插件轻松实现树状视图

外媒速递是核子可乐精选的近日国外媒体的精彩文章推荐,希望大家喜欢!本期给大家推荐的是五款jQuery插件轻松实现树状视图...4月26日

jQuery动画下拉菜单 自定义菜单内容

这次我们要来分享一款jQuery菜单插件,这是一款jQuery动画下拉菜单,这款菜单的特点是下拉菜单项可以自定义内容,可以是图片和图文结合的内容,非常灵活...5月10日

jQuery与js常用方法对比

一)文档就绪jQuery实现$(document).ready(function(){//开始写jQuery代码...})...4月12日

jquery图片查看插件,支持旋转、放大、缩小、拖拽、缩略图(仿qq图片查看)

最近做了一个jquery图片查看的插件,目的是能精确查看图片的详情,插件支持图片旋转、放大、缩小、拖拽、缩略图显示...3月30日

ThinkPHP中使用jQuery实现多条件组合筛选

使用ThinkPHP编写多条件组合筛选不是特别好实现,最直接的方法就是使用js辅助。本案例使用的是jquery。这里要实现的功能如下:多组筛选分类相互不冲突...4月18日

拥有强大的选择器、出色的DOM操作、可靠的事件处理、完善的兼容性和链式操作等功能。二、加入jQueryjQuery简介由JohnResig创建于2006年1月的开源项目...5月7日

jQuery特效 | 导航底部横线跟随鼠标缓动

:jQuery来实现如下特效-在导航底部存在一条横线,跟随着鼠标缓动到相应导航项底部。2月初,接收到了公众号读者的效果需求,希望能够讲解这样一个实例:横排的导航...2月27日

炫酷实用 7款jQuery/HTML5图片应用

jQuery非常强大,我们这里有很多关于jQuery焦点图的插件,今天我们精选了7款利用jQuery和HTML5实现的超炫酷图片特效应用,有些也是焦点图插件...3月14日

前端每周清单:jQuery 3.2发布,滴滴采用Vue 2.0重构Web App、饿了么 PWA 实...

从属于笔者的Web前端入门与工程实践。更多阅读清单请转向往期索引。前端每周清单:前端每周清单:jQuery3.2发布,滴滴采用Vue2.0重构WebApp...3月20日

小白都会的 jQuery 小技巧(中),再来瞄一眼!

jQuery的小技巧,不管是平民,还是小仙,掌握了这些秘籍,相信你很快就会飞升上仙了,哈哈。检测浏览器注:在版本jQuery1.4中,$.support替换掉了$...3月4日

任何使用jQuery Mobile网站中都存在一个尚未修复的...

ardoVela在jQueryMobile框架中发现了一个安全漏洞,这个漏洞将会让所有使用了jQueryMobile的网站暴露于跨站脚本攻击风险之下。安全客小百科...2月16日

用jQuery Mobile做HTML5移动应用的三个优缺点和缺点

我一直在使用JQueryMobile为一个健身培训网站开发基于HTML5的手机/平板前端应用...2月13日

jQuery 源码系列(十七)css 相关操作

作也是jQuery比较常用的一个操作,就我本人而言,这个css函数用多了,感觉自己有点傻乎乎的,主要还是自己不了解js中css的真正含义。不过现在不怕了。开始之前...3月5日

全部展开 | 全部折叠 | jQuery API手册