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 相关文章推荐
淘宝搜索框效果实现分析
Mar 05 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 Javascript
常见的原始JS选择器使用方法总结
Apr 09 Javascript
javascript实现获取服务器时间
May 19 Javascript
require.js的用法详解
Oct 20 Javascript
JavaScript电子时钟倒计时
Jan 09 Javascript
vue loadmore组件上拉加载更多功能示例代码
Jul 19 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
js如何找出字符串中的最长回文串
Jun 04 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
Aug 31 Javascript
vue-better-scroll 的使用实例代码详解
Dec 03 Javascript
js实现抽奖的两种方法
Mar 19 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
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
tp5框架基于ajax实现异步删除图片的方法示例
2020/02/10 PHP
js 浏览器事件介绍
2012/03/30 Javascript
js自动下载文件到本地的实现代码
2013/04/28 Javascript
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
Vue.js 图标选择组件实践详解
2018/12/03 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
2019/04/22 Javascript
小程序实现搜索框
2020/06/19 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
Win10下Python环境搭建与配置教程
2016/11/18 Python
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
Python Pandas批量读取csv文件到dataframe的方法
2018/10/08 Python
详解python之heapq模块及排序操作
2019/04/04 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
Rentalcars.com中国:世界上最大的在线汽车租赁服务
2019/08/22 全球购物
护理专科毕业推荐信
2013/11/10 职场文书
周年庆典主持词
2014/04/02 职场文书
检讨书范文
2019/04/16 职场文书
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server