jQuery中bind方法和live方法区别解析
Javascript中的事件有它的独特性,有默认的执行事件,例如冒泡就是其中的一个。在很多比较复杂的应用程序中,停止事件的冒泡或捕获在程序开发当中是十分有用的,而在IE中有它的独特方式来阻止事件的冒泡(和其它浏览器方式不同)。 以下给出一种通用的方式来实现阻止事件的冒泡,该通用方式接受一个参数[传递到事件处理程序中的事件对象],该函数处理取消事件冒泡的两种方式:标准的W3C方式和非标准的IE方式:
什么是事件冒泡[又称为事件传播]:当我们点击一个元素时,它会触发bind在该元素上的click事件,如果该click事件被触发后,它会向其父元素传播,并且触发其父元素的click事件,直到根节点的document节点。
///
/// 取消冒泡事件
///
function stopBubble(ev){
if(ev&&ev.stopPropagation){ //因此它支持W3C的stopPropagation()方法
ev.stopPropagation();
}
else { //否则,我们需要使用IE的方式来取消事件冒泡
window.event.cancelBubble = true;
} }
接下来介绍一下jQuery中bind、live和delegate之间的区别:
1. bind只能对当前存在的dom元素作用,对于通过Javascript代码动态添加的dom元素是无作用的;
2. live弥补了bind的上述缺陷,live可以对当前不存在的dom元素起作用,也就是说可以对后来通过Javascript代码动态添加的dom元素起作用;
3. delegate适用于当前存在的或者是后来通过代码动态添加的子元素,例如:
$(document).ready(function(){
$('div').delegate('p','click',function(){
$(this).slideToggle();
});
$('button').click(function(){
$('<p>This is new added section</p>').insertAfter('button');
});
});
live之所以能够对后来动态生成的dom元素绑定事件原因归结在"事件委托上",所谓的"事件委托"就是指绑定在祖先元素上的事件可以对其后代元素作用,live的实现原理就是直接将事件绑定在Dom树根节点上。
举个例子:
$('.clickMe').live('click',function(){alert('You have already clicked me.')});
$('body').append('<div class="clickMe">测试一下Click me</div>');
当我们点击新添加的div元素时,会依次发生如下的步骤:
1. 生成一个click事件,传递个div做处理;
2. 由于没有在div上直接绑定click事件,所以事件直接冒泡到Dom树上;
3. 事件不断的冒泡,直到Dom树的根节点上,默认情况下,树的根节点上就绑定了click事件;
4. 执行由live绑定的click事件;
5. 检测绑定事件的对象是否存在,判断是否要继续执行绑定的事件,检测事件对象是通过检测$(event.target).closest('.clickMe') 能否找到匹配的元素来实现的;
6. 通过 5 的测试,如果绑定事件的对象存在的话,就执行绑定的事件。
live方法,由于事件发生的时候才去检测对象是否存在,因此可以实现事件作用于后来动态添加的Dom元素,而bind方法则是在绑定事件的时候就检测该Dom元素是否存在,因此,不可以作用于后来动态添加的Dom元素。
但是在一些情况下,live函数是不能够替代bind函数的:
1. bind方法可以绑定任何JavaScript的事件,而live方法在jQuery1.3 的时候只支持click, dblclick, keydown, keypress, keyup,mousedown, mousemove, mouseout, mouseover, 和 mouseup. 在jQuery 1.4.1中,甚至也支持 focus 和 blue事件了(映射到更合适,并且可以冒泡的focusin和focusout上)。另外,在jQuery 1.4.1 中,也能支持hover(映射到"mouseenter mouseleave");
2. live()并不完全支持通过Dom遍历的方法找到的元素。取而代之的是,应当总是在一个选择器后面直接使用 .live()方法;
3. 当一个元素采用live方法进行事件的绑定的时候,如果想阻止事件的传递或冒泡,就要在函数中return false,仅仅调用stopPropagation()是无法实现阻止事件的传递或者冒泡的。
jQuery中bind方法和live方法区别解析的更多相关文章
- jquery中prop()方法和attr()方法
接着上一篇笔记的疑惑,找了下prop()方法和attr()方法的区别. 原来query1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. ...
- js进阶 12-13 jquery中one方法和trigger方法如何使用
js进阶 12-13 jquery中one方法和trigger方法如何使用 一.总结 一句话总结: 1.one()方法和on()方法的区别是什么? 除了one()只执行一次,其它和on()一模一样,包 ...
- jquery中attr方法和prop方法的区别
关于checked的属性,最重要的概念就是你要记住,它跟checked的状态值是毫无关系的,设置checked = "checked"或者checked = "true& ...
- jquery中prop()方法和attr()方法的区别浅析
官方例举的例子感觉和attr()差不多,也不知道有什么区别,既然有了prop()这个新方法,不可能没用吧,那什么时候该用attr(),什么时候该用prop()呢 jquery1.6中新加了一个方法pr ...
- jquery中prop()方法和attr()方法的区别(转)
jquery1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. 官方例举的例子感觉和attr()差不多,也不知道有什么区别,既然有了pro ...
- jquery中prop()方法和attr()方法的区别
最近在用jquery的时候遇到一个问题,那就是attr()方法,发现这个方法有时候使用会有一些说不出原因的问题.翻翻自己之前笔记发现,还有个函数prop(). 这两个函数都可以用来获取属性. jque ...
- thinkphp3.2.3中U()方法和redirect()方法区别
今天博主看3.1的教程,学着3.2,就遇到了这个坑,怎么就是不跳转呢,很纳闷!! 在thinkphp3.1 中 U()方法是可以执行跳转的(看视频教程里面是可以的,博主没有测试过). 但是在think ...
- java中equals方法和contentEquals方法区别
java中,String类里提供了两种字符串的比较方式(算上“==”应该是三种) String line1 = new String("0123456789"); String l ...
- python list中append()方法和extend()方法区别
共同点 只能作用于list类型(不能作用于tuple等其他类型) 单参数限制(不支持多参数) 不同点 list.append(object) 向列表中添加一个对象object. 使用append的时候 ...
随机推荐
- 简化通过classname查找 方法
function getClass(oParent,sclass){ var aEle=oParent.getElementsByTagName('*'); var result=[]; for(va ...
- mongo virtual
var options={"upsert":false,"multi":false,'new':false}; 不存是否插入,更新是否批量,返回内容是更新前还是 ...
- Permutations II 再分析
记得第一遍做这题的时候其实是没什么思路的,但是第二次的时候,我已经有"结果空间树"的概念了.这时候再看https://oj.leetcode.com/problems/permut ...
- com.android.internal.os.ZygoteInit$MethodAndArgsCaller 解决
好久没写博客了,带着点小愧疚来,添上几个字: 这是今天遇到的一个bug,之前也遇到过,为了后面方便,就记下. bug提示:com.android.internal.os.ZygoteInit$Meth ...
- Oracle 行转列(不固定行数的行转列,动态)(转)
http://bbs.csdn.net/topics/330039676 SQLSERVER :行列转换例子: http://www.cnblogs.com/gaizai/p/3753296.htm ...
- JAVA第二次作业展示与学习心得
JAVA第二次作业展示与学习心得 在这一次作业中,我学习了复选框,密码框两种新的组件,并通过一个邮箱登录界面将两种组件运用了起来.具体的使用方法和其他得组件并没有什么大的不同. 另外我通过查阅资料使用 ...
- CnBlog客户端Windows Live Write安装方法
官方帮助http://space.cnblogs.com/forum/topic/8550 注:如果自动配置没有成功,需要手动配置: a) 在"Type of weblog that yo ...
- iOS学习之判断是否有网络的方法
在实际开发中, 会有这样一个需求: 用户在有网的状态下会直接从网络请求数据, 在没网的情况下直接从本地读取数据. 下边的方法可以判断是否有网络. - (BOOL)connectedToNetwork ...
- 如何在Outlook中打开后缀 .eml 的附件
引用:http://jingyan.baidu.com/article/6fb756ec82c301241858fb1e.html
- canvas标签(1)--线条、矩形、圆形、文本、阴影、抛小球
从网上扒拉的代码,敲了敲代码玩. html页面显示内容很简单,只要写个canvas标签,给他一个id写js就可以了 <!DOCTYPE html> <html> <hea ...