jQuery中.live()方法的用法深入解析


Posted in Javascript onDecember 30, 2013

给jquery动态生成的页面元素添加事件?使用livequery插件,或可以使用jquery的live方法。摘录一段live简单使用方法。

更多详情还见官网 http://api.jquery.com/live/

live(type, [data],fn)

概述

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

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

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

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

当点击了元素,就会弹出一个警告框。

然后,想象一下这之后有另一个元素添加进来了。

$('body').append('
Another target
');

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

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

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

然后再添加一个新元素:

$('body').append('
Another target
');

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

事件委托

.live()方法能对一个还没有添加进DOM的元素有效,是由于使用了事件委托:绑定在祖先元素上的事件处理函数可以对在后代上触发的事件作出回应。

传递给 .live()的事件处理函数不会绑定在元素上,而是把他作为一个特殊的事件处理函数,绑定在 DOM树的根节点上。在我们的例子中,当点击新的元素后,会依次发生下列步骤:

1、生成一个click事件传递给<div> 来处理

2、由于没有事件处理函数直接绑定在 <div>上,所以事件冒泡到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上)。

另外,在jQuery1.4.1中,也能支持hover(映射到"mouseenter mouseleave")。然而在jQuery1.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() 提供的功能类似。

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

参数

typeString     事件类型

data(可选)    Object          欲绑定的事件处理函数

fn                  Function        欲绑定的事件处理函数

示例

HTML 代码:
 
Click me!

jQuery 代码:
    $("p").live("click", function(){
         $(this).after("

Another paragraph!

");
    });

描述:

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

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

描述:

仅仅阻止默认事件行为

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

Javascript 相关文章推荐
javascript-表格排序(降序/反序)实现介绍(附图)
May 30 Javascript
jQuery中even选择器的定义和用法
Dec 23 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
Oct 10 Javascript
原生js图片轮播效果实现代码
Oct 19 Javascript
jQuery Mobile和HTML5开发App推广注册页
Nov 07 Javascript
jQuery命名空间与闭包用法示例
Jan 12 Javascript
微信小程序新增的拖动组件movable-view使用教程
May 20 Javascript
jsonp跨域请求详解
Jul 13 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 Javascript
fetch 使用及如何接收JS传值
Nov 11 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
May 09 jQuery
Angularjs中的$apply及优化使用详解
Jul 02 Javascript
Javasipt:操作radio标签详解
Dec 30 #Javascript
js获取select标签的值且兼容IE与firefox
Dec 30 #Javascript
jquery获得keycode的示例代码
Dec 30 #Javascript
原生javaScript做得动态表格(注释写的很清楚)
Dec 29 #Javascript
JS对象转换为Jquery对象实现代码
Dec 29 #Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
Dec 29 #Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
Dec 29 #Javascript
You might like
ThinkPHP标签制作教程
2014/07/10 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
php单例模式的简单实现方法
2016/06/10 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
javascrip关于继承的小例子
2013/05/10 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
nodejs基础知识
2017/02/03 NodeJs
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
JS实现简单省市二级联动
2019/11/27 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
jquery自定义组件实例详解
2020/12/31 jQuery
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
Python运算符+与+=的方法实例
2021/02/18 Python
深入浅出CSS3 background-clip,background-origin和border-image教程
2011/01/27 HTML / CSS
印度服装购物网站:Limeroad
2018/09/26 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
软件测试笔试题
2012/10/25 面试题
三八红旗手先进事迹材料
2014/05/13 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
2016年最美孝心少年事迹材料
2016/02/26 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
Python进行区间取值案例讲解
2021/08/02 Python
海弦WR-800F
2022/04/05 无线电