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把图片转化为字符画
Oct 24 Javascript
Javascript原型链和原型的一个误区
Oct 22 Javascript
jQuery实现下拉框选择图片功能实例
Aug 08 Javascript
快速学习jQuery插件 Form表单插件使用方法
Dec 01 Javascript
input点击后placeholder中的提示消息消失
Jan 15 Javascript
第九章之路径分页标签与徽章组件
Apr 25 Javascript
AngularJS基础 ng-switch 指令简单示例
Aug 03 Javascript
深入理解Angular中的依赖注入
Jun 26 Javascript
angular6的table组件开发的实现示例
Dec 26 Javascript
新手简单了解vue
May 29 Javascript
vue指令v-html使用过滤器filters功能实例
Oct 25 Javascript
vue使用element-ui按需引入
May 20 Vue.js
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
php比较多维数组中值的大小排序实现代码
2012/09/08 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
phalcon框架使用指南
2016/02/23 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
JavaScript的public、private和privileged模式
2009/12/28 Javascript
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
简单介绍Python中的几种数据类型
2016/01/02 Python
python实现感知器
2017/12/19 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
Python中enumerate()函数编写更Pythonic的循环
2018/03/06 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
游戏商店:Eneba
2020/04/25 全球购物
vue路由实现登录拦截
2021/03/24 Vue.js
语文高效课堂实施方案
2014/05/03 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
2016年母亲节寄语
2015/12/04 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL