- 浏览: 1460510 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
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.
提高了效率 。
评论
只能原生吧
$(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 事件。
我这样处理没有反映
不知如何修改
发表评论
-
模块化高扩展性的前端框架 KISSY
2013-03-14 14:58 8619模块化高扩展性的前端框架 KISSY 注:本文为 2 ... -
构建前端 DSL
2012-10-11 22:10 5359目前在传统的软件开 ... -
KISSY kisses bootstrap navbar
2012-08-03 01:12 6028看了下 bootstrap 的导航菜单,立刻非常喜欢,注意是浅 ... -
promise api 与应用场景
2012-02-07 17:34 7377promise 是 commonjs 社区中提出的异步规范,其 ... -
unified event model
2011-10-14 23:02 1784为了处理原生事件在各 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2845简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2846场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2269分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7047作为前端开放的基础安全保证,caja 是目前比较合 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2476这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
just another event model
2011-06-08 20:47 2167事件模型也算是客户端兼容性的一个长期问题,早期 jquery ... -
框架 build 系统介绍
2010-07-11 01:29 1658一个复杂的类库通常都包括很多子模块( jquery@git ... -
querySelectorAll 探讨
2010-07-01 22:35 5151随着css selector engine在越来越多的java ... -
再谈 attribute
2010-06-22 11:37 2657@slideshare 原生: ... -
事件机制探讨
2010-06-21 13:54 2223由于浏览器事件机制的不兼容性,譬如最常见的注册事件差异 ... -
利用Attribute重构:业务与UI分离
2010-06-08 16:54 1587很简单的一个应用 通过按钮来限制输入范围 ,这样的话再 ... -
yui3 loader的串行加载特性
2010-06-04 12:30 1815yui3 的沙箱机制可以在 ... -
yui3下的load事件触发
2010-06-01 13:31 3224以前的一些总结:页面l ... -
理解YUI3 extension:Base.create
2010-05-31 03:01 2001YUI3中为了避免不必要的类继承层次,以及摆脱利用原型链模拟的 ... -
google WebFont Loader 源码阅读
2010-05-22 01:04 2781资料: 关于新发 ...
相关推荐
jquery.livequery.js是jquery中的动态绑定事件所需的plugins
2. **插件安装与使用**:在你的项目中使用Live Query,首先需要下载并引入livequery.js文件,然后通过$.livequery()方法注册你想要执行的函数。例如,如果你希望每当有新的`.box`元素被添加到DOM时,为其添加背景色...
在【压缩包子文件的文件名称列表】中,我们看到的是`livequery-master`,这通常表示这是一个包含了Live Query插件源码的主目录。在这个目录中,可能包含以下内容: 1. `src`子目录:存放插件的源代码文件,通常是...
这是一些jQuery livequery的小例子源码演示,我想对学习livequery是有一定帮助的,实例中一共包括三个演示文件: 第一个演示:livequery导致的超链接点击; 第二个演示:livequery匹配rel属性值中含有"friend"的A...
提供LiveQuery(类似于SQL)以响应组件使用redux-livequery库的Todos Live Demo ()动机Redux提供了一种管理React应用程序状态的好方法,但是它缺少查询/聚合操作来将多个状态组合在一起以获取我们想要的数据...
解析适用于Android的LiveQuery Client ParseQuery是Parse的关键概念之一。 它允许您通过指定一些条件来检索ParseObject ,从而轻松构建诸如仪表板,待办事项列表甚至某些策略游戏之类的应用程序。 但是, Parse...
至于与流行插件liveQuery的比较,live方法不支持“无事件”的回调函数,也没有插件提供的“setup”和“cleanup”过程。这一点在某些情况下可能会限制其使用。 当需要移除使用live方法绑定的事件时,应使用die方法,...
使用livequery插件,或可以使用jquery的live方法。摘录一段live简单使用方法。 更多详情还见官网 http://api.jquery.com/live/ live(type, [data],fn) 概述 jQuery给所有匹配的元素附加一个事件处理函数,即使这个...
然而,由于 `live()` 方法有一些限制,例如不支持某些事件类型和不提供 `liveQuery` 插件的高级特性,所以在 jQuery 1.7 版本中,`live()` 被 `on()` 方法取代。`on()` 方法更加强大,可以处理所有类型的事件,并且...
在jQuery 1.3到1.9版本中,`livequery.js`插件被引入,它扩展了`live()`的功能,允许动态添加的元素也能够响应事件。但自jQuery 1.7起,`live()`已被弃用,推荐使用`on()`来替代。 ```javascript // 使用jQuery 1.7...
14. **liveQuery()**: 一个非jQuery核心的插件,提供类似 `live()` 的功能,但更强大。 15. **other events**: 还有许多其他事件,如 `load()`(加载完成),`resize()`(窗口大小改变),`scroll()`(滚动事件),...
然而,`live()`只支持一部分事件,不包括blur、focus等,且不提供`liveQuery`插件的一些特性,如无事件回调。移除`live()`绑定的事件需使用`die()`方法。 3. `jQuery die( [type ] )` 与`live()`相对应,`die()`...
`jquery.livequery.js`是jQuery的一个插件,它扩展了jQuery的`.live()`方法,使得即使在DOM改变后,已绑定的事件仍然有效。这在动态内容加载的网页中非常有用。 总结来说,这个“jQuery小例子”涵盖了jQuery的基础...
`.delegate()`和`.live()`(在jQuery 1.7后被`.on()`取代)则用于动态添加元素时仍能响应事件。 四、动画效果 jQuery的`.animate()`方法是创建自定义动画的关键,它能改变CSS属性并创建平滑过渡。`.show()`, `....