`
yiminghe
  • 浏览: 1460510 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

live与livequery

阅读更多

ejohn在最新的一篇博客说到 jquery closest 增加参数数组类型 , 并提到了live这个功能,其他框架库我还没有见过这个功能,记得以前jq官方没有live时,听过过它的一个插件livequery,可以对并不存在的dom结点绑定事件,觉得很有意思,这次就一并简单研究了下:


livequery:

使用:


$('div.noexists').livequery('click',
          function(){
            alert(this.innerHTML);
          }
        );

 

那么即使当前页面没有类为 noexists 的 div 结点,以后当你添加后,


$(document.body).append("<div class='noexist'>test</div>");

 

事件会自动注册到这个结点上面去。

 

原理:

 

看完其源代码后,觉得实现确实不是很难,基本原理就是修改jquery原来的所有DOM更改操作:'append', 'prepend', 'after', 'before', 'wrap', 'attr', 'removeAttr', 'addClass', 'removeClass', 'toggleClass', 'empty', 'remove',在进行官方操作后运行自己的代码:

 

对之前的运行过 livequery 的所有选择符比如这里的div.noexists全部取出来,然后判断是否已经注册过指定事件处理了,如果没有就注册。

 

其中的细节还有对livequery 选择符的注册队列管理,以及清除,暂停一系列机制。


优点:

 

将创建添加元素与事件注册处理,分隔开来,对一类元素设置好livequery后,以后只要专注与内容修改即可,程序会更加有条理。

 

缺点:

 

每次更改任意部分结点内容都要将livequery 选择符重新判断一次,对于性能要求严格以及livequery选择符很多时慎用。



live:

jquery大概在1.3后实现了live,功能与livequery核心大致相同,但实现迥异,jquery利用了delagation,即事件委托机制,早先将事件全部委托给document处理,1.4以后事件委托给元素的context处理,性能更有提高。(As of jQuery 1.4, event bubbling can optionally stop at a DOM element "context")

 

使用:

 

$('div.noexists').live('click',
          function(){
            alert(this.innerHTML);
          }
        );


运行后,click事件注册到 $('div.noexists').context即document上面,当click事件发生时,传播到document处理,从click事件的源目标(target)一直往上找,将第一个符合div.noexists的结点做为事件处理函数的this上下文然后执行事件处理函数。


优化:

 

这次,ejohn之所以要对closest修改,就是因为当多个live选择符时,当触发事件时原先是对每个选择符都执行上述操作:

 

jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
		if ( check.test(fn.type) ) {
			var elem = jQuery(event.target).closest(fn.data)[0];
			if ( elem )
				elems.push({ elem: elem, fn: fn });
		}
	});

 

这样的话对于下列代码:

 

<html>
  <body>
    <div id="main">
      <div id="test">
        <div id="mouseme"></div>
      </div>
    </div>
  </body>
</html>
$("#mouseme").live("mousemove", ...)
$("#main").live("mousemove", ...)
$("body").live("mousemove", ...) // (plugin A)
$("body").live("mousemove", ...) // (plugin B)


 在jquery1.3.2中:

 

 1.  #mouseme check on #mouseme (load Sizzle)
 2. Return.
 3. #main check on #mouseme (load Sizzle)
 4. Walk up tree.
 5. #main check on #test (load Sizzle)
 6. Walk up tree.
 7. #main check on #main (load Sizzle)
 8. Return.
 9. body check on #mouseme (load Sizzle)
10. Walk up tree.
11. body check on #test (load Sizzle)
12. Walk up tree.
13. body check on #main(load Sizzle)
14. Walk up tree.
15. body check on body (load Sizzle)
16. Return.
17. body check on #mouseme (load Sizzle)
18. Walk up tree.
19. body check on #test (load Sizzle)
20. Walk up tree.
21. body check on #main(load Sizzle)
22. Walk up tree.
23. body check on body (load Sizzle)
24. Return.
25. Sort all element results.
26. Loop through the results to trigger.


jquery1.4 closest增加了参数数组类型

 

	while ( cur && cur.ownerDocument && cur !== context ) {
					for ( selector in matches ) {
						match = matches[selector];

						if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
							ret.push({ selector: selector, elem: cur });
							delete matches[selector];
						}
					}
					cur = cur.parentNode;
				}
			}
 


则当前目标对于所有选择符只需walk up tree一次即可!


 1.  #mouseme check on #mouseme (load Sizzle)
 2. #main check on #mouseme (load Sizzle)
 3. body check on #mouseme (load Sizzle)
 4. Walk up tree.
 5. #main check on #test (load Sizzle)
 6. body check on #test (load Sizzle)
 7. Walk up tree.
 8. #main check on #main (load Sizzle)
 9. body check on #main (load Sizzle)
10. Walk up tree.
11. body check on body (load Sizzle)
12. Return.
13. Loop through the results to trigger.


提高了效率

 

 

 

 

3
0
分享到:
评论
2 楼 yiminghe 2011-01-07  
不懂啊,live还能自定义事件了?

只能原生吧
1 楼 wafj999 2011-01-07  
请问这个live()。如何使用自定义的函数比如

$(select).live('droppable',function(){
            onDragOver:function(e,source){
  indicator.css({
                        display:'block',                         
                        top:$(this).offset().top+$(this).outerHeight()-5,
                        left:$(this).offset().left-10
          });
处理后来js生成的select元素使其拥有 droppable 事件。
我这样处理没有反映
不知如何修改

相关推荐

    jquery.livequery.js

    jquery.livequery.js是jquery中的动态绑定事件所需的plugins

    前端项目-livequery.zip

    2. **插件安装与使用**:在你的项目中使用Live Query,首先需要下载并引入livequery.js文件,然后通过$.livequery()方法注册你想要执行的函数。例如,如果你希望每当有新的`.box`元素被添加到DOM时,为其添加背景色...

    前端项目-hazzik-jquery.livequery.zip

    在【压缩包子文件的文件名称列表】中,我们看到的是`livequery-master`,这通常表示这是一个包含了Live Query插件源码的主目录。在这个目录中,可能包含以下内容: 1. `src`子目录:存放插件的源代码文件,通常是...

    jQuery livequery 三个使用例子示例.rar

    这是一些jQuery livequery的小例子源码演示,我想对学习livequery是有一定帮助的,实例中一共包括三个演示文件: 第一个演示:livequery导致的超链接点击; 第二个演示:livequery匹配rel属性值中含有"friend"的A...

    redux-livequery:提供类似于SQL的LiveQuery来响应组件

    提供LiveQuery(类似于SQL)以响应组件使用redux-livequery库的T​​odos Live Demo ()动机Redux提供了一种管理React应用程序状态的好方法,但是它缺少查询/聚合操作来将多个状态组合在一起以获取我们想要的数据...

    ParseLiveQuery-Android:解析适用于Android的LiveQuery客户端

    解析适用于Android的LiveQuery Client ParseQuery是Parse的关键概念之一。 它允许您通过指定一些条件来检索ParseObject ,从而轻松构建诸如仪表板,待办事项列表甚至某些策略游戏之类的应用程序。 但是, Parse...

    jQuery live

    至于与流行插件liveQuery的比较,live方法不支持“无事件”的回调函数,也没有插件提供的“setup”和“cleanup”过程。这一点在某些情况下可能会限制其使用。 当需要移除使用live方法绑定的事件时,应使用die方法,...

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

    使用livequery插件,或可以使用jquery的live方法。摘录一段live简单使用方法。 更多详情还见官网 http://api.jquery.com/live/ live(type, [data],fn) 概述 jQuery给所有匹配的元素附加一个事件处理函数,即使这个...

    jQuery live( type, fn ) 委派事件实现

    然而,由于 `live()` 方法有一些限制,例如不支持某些事件类型和不提供 `liveQuery` 插件的高级特性,所以在 jQuery 1.7 版本中,`live()` 被 `on()` 方法取代。`on()` 方法更加强大,可以处理所有类型的事件,并且...

    JQuery 动态删除添加html元素bind事件

    在jQuery 1.3到1.9版本中,`livequery.js`插件被引入,它扩展了`live()`的功能,允许动态添加的元素也能够响应事件。但自jQuery 1.7起,`live()`已被弃用,推荐使用`on()`来替代。 ```javascript // 使用jQuery 1.7...

    jQuery参考手册-事件总结

    14. **liveQuery()**: 一个非jQuery核心的插件,提供类似 `live()` 的功能,但更强大。 15. **other events**: 还有许多其他事件,如 `load()`(加载完成),`resize()`(窗口大小改变),`scroll()`(滚动事件),...

    jquery常用函数与方法汇总

    然而,`live()`只支持一部分事件,不包括blur、focus等,且不提供`liveQuery`插件的一些特性,如无事件回调。移除`live()`绑定的事件需使用`die()`方法。 3. `jQuery die( [type ] )` 与`live()`相对应,`die()`...

    jquery 小例子

    `jquery.livequery.js`是jQuery的一个插件,它扩展了jQuery的`.live()`方法,使得即使在DOM改变后,已绑定的事件仍然有效。这在动态内容加载的网页中非常有用。 总结来说,这个“jQuery小例子”涵盖了jQuery的基础...

    《JQuery1.3中文参考手册》-电子文档下载HTML

    `.delegate()`和`.live()`(在jQuery 1.7后被`.on()`取代)则用于动态添加元素时仍能响应事件。 四、动画效果 jQuery的`.animate()`方法是创建自定义动画的关键,它能改变CSS属性并创建平滑过渡。`.show()`, `....

Global site tag (gtag.js) - Google Analytics