传统的时间处理:

给某一个元素绑定一个点击事件,传入一个回调句柄处理

element.addEventListener('click',doSomething,false);

这样的绑定如果页面上面有几百个需要绑定,那么就要绑定几百多次。

问题:

大量的事件绑定,性能消耗,而且还需要解绑(IE会泄露)

绑定的元素必须要存在。

后期生成HTML会没有事件绑定,需要重新绑定。

语法过于繁杂

事件委托

DOM有个事件流的特性,在页面上触发节点的时候事件都会上下或者向上传播,事件捕捉和事件冒泡。

事件传送可以分为3个阶段:

在事件Capturing捕捉阶段,时间将沿着DOM数向下转送,目标节点的每一个祖先节点,直至目标节点,

在目标target阶段,浏览器在查找到已经指定给目标事件的事件监听器之后,就会运行该事件监听器,目标节点就是触发事件的DOM节点。

在冒泡bubbling阶段,事件将沿着DOM树向上转送,再次逐个访问目标元素的祖先节点到document节点,该过程中的每一步,浏览器都将检测那些不是捕捉事件监听器的事件监听器,并执行他们,

利用事件传播这个机制,就可以实现事件委托。

事件委托就是时间目标自身不处理事件,而是吧处理任务委托给其他父元素或者祖先元素,甚至根元素。

jquery的事件优化.bind(),.live(),.on(),.delegate()

on()方法事件处理程序到当前选定的jquery对象中的元素,提供绑定事件处理的所有功能。

性能对比

生成999个DOM节点,不做任何处理,内存消耗2.2M

给每个元素绑定click事件。增加到5.6M,用on2.2M

只要on的delegate对象是HTML页面缘由的元素,由于是事件的触发是通过Javascript的事件冒泡机制来检测,所以对于所有子元素所有的事件监测均能有效,且由于不用对多个元素进行事件绑定,能够有效的节省内存的损耗。

bing()方法用于直接附加一个事件处理程序到元素上。

处理程序附加到jquery对象中当前选中的元素,所以,在bing()绑定事件的时候,这些元素必须已经存在。

live()将委托的事件处理程序附加到一个页面的decument元素,从而简化了在页面上动态添加的内容上事件处理的使用,

例子:$('a').live('click'.function(){alert('2121')});

jquery把alert函数绑定到$(document)元素上,并使用click和a做为参数。

任何时候只要在事件冒泡到document节点上,他就查看该事件是否是一个click事件,以及该事件的目标元素与a这一css选择权是否匹配,如果都是的话,则执行函数。

使用live()会出现的问题:

在调用live方法之前,jquery会先获取与指定的选择权匹配的元素, 这一点对于大型文档来说是很花费时间的。

不支持链式写法,$('a').find('').live(),不支持。

由于所有的live事件被添加到document元素上,所以在事件被处理之前,可能回通过最长最慢的那条路径之后才能被触发。

在事件处理中调用event.stopPropagation()来阻止事件内添加到document之后的节点中,是效率很低的,因为事件已经被传播到document上。

delegate

$(#element).delegate('a','click',function(){alert('1212')});

jquery查找#element,并使用click事件和a这一css选择权作为参数把alert函数绑定到#element上。

任何时候只要有事件冒泡到#element上,他就查看该事件是否是click事件,以及该事件的目标元素是否与css选择器匹配,如果两种检查的结果都为真的话,他就执行函数.

这一过程与live类似, 但是它把处理程序绑定带具体的元素而非document这一根上,

('a').live()==document.delegate('a')?

delegata方法是一个相对完美的解决方案,但在DOM结构简单的情况在,也可以使用live().

on

其实bind,live,delegate都是通过on()来实现的,unbind,die,undelegate,也是一样的都是通过off来实现的,

在下列情况下,应该使用live或delegate,而不能使用bind

为DOM中的很多元素绑定相同事件。

为DOM中尚不存在的元素绑定事件。

用bind的代价是非常大的,他会把相同的一个事件处理程序hook到所有匹配的DOM元素上,不要再用live了,他已经不再推荐了,而且还有很多问题。

delegate会提供很好的方法来提高效率,同时我们可以添加一事件处理方法到动态添加的元素上,

jQuery 2.0.3 源码分析 bind/live/delegate/on的更多相关文章

  1. jQuery 2.0.3 源码分析Sizzle引擎解析原理

    jQuery 2.0.3 源码分析Sizzle引擎 - 解析原理 声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 先来回答博友的提问: 如何解析 div > p + ...

  2. jQuery 2.0.3 源码分析 事件绑定 - bind/live/delegate/on

    事件(Event)是JavaScript应用跳动的心脏,通过使用JavaScript ,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应 事件的基础就不重复讲解了,本来是定位源码分析 ...

  3. jQuery 2.0.3 源码分析 事件体系结构

    那么jQuery事件处理机制能帮我们处理那些问题? 毋容置疑首先要解决浏览器事件兼容问题 可以在一个事件类型上添加多个事件处理函数,可以一次添加多个事件类型的事件处理函数 提供了常用事件的便捷方法 支 ...

  4. jQuery 2.0.3 源码分析 Deferred(最细的实现剖析,带图)

    Deferred的概念请看第一篇 http://www.cnblogs.com/aaronjs/p/3348569.html ******************构建Deferred对象时候的流程图* ...

  5. jQuery 2.0.3 源码分析core - 选择器

         声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢!      打开jQuery源码,一眼看去到处都充斥着正则表达式,jQuery框架的基础就是查询了,查询文档元素对象 ...

  6. jQuery 2.0.3 源码分析 Deferred概念

    JavaScript编程几乎总是伴随着异步操作,传统的异步操作会在操作完成之后,使用回调函数传回结果,而回调函数中则包含了后续的工作.这也是造成异步编程困难的主要原因:我们一直习惯于“线性”地编写代码 ...

  7. jQuery 2.0.3 源码分析 Deferrred概念

    转载http://www.cnblogs.com/aaronjs/p/3348569.html JavaScript编程几乎总是伴随着异步操作,传统的异步操作会在操作完成之后,使用回调函数传回结果,而 ...

  8. jQuery 2.0.3 源码分析core - 整体架构

    拜读一个开源框架,最想学到的就是设计的思想和实现的技巧. 废话不多说,jquery这么多年了分析都写烂了,老早以前就拜读过, 不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery ...

  9. jQuery 2.0.3 源码分析Sizzle引擎 - 解析原理

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 先来回答博友的提问: 如何解析 div > p + div.aaron input[type="checkb ...

随机推荐

  1. include_path详细解析

    include_path详细解析     原文地址:http://www.laruence.com/2010/05/04/1450.html 1.php默认的包含路径为 .;C:\php\pear 即 ...

  2. GCC编译器代码优化

    代码优化是指编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能.GCC提供的代码优化功能非常强大,它通过编译选项-On来控制优化代码的生成,其中n是一个代 ...

  3. 4、Type fundamentals

    1.All Types Are Derived from System.Object The CLR requires all objects to be created using the new ...

  4. [SAP ABAP开发技术总结]Form(subroutine)、Function参数传值传址

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. FJNU 1155 Fat Brother’s prediction(胖哥的预言)

    FJNU 1155 Fat Brother’s prediction(胖哥的预言) Time Limit: 1000MS   Memory Limit: 257792K [Description] [ ...

  6. LINQ之路 1: LINQ介绍

    LINQ是.NET Framework 3.5的新特性,其全称是 Language Integrated Query,即语言集成查询,是指将查询功能和语言结合起来.从而为我们提供一种统一的方式,让我们 ...

  7. .htaccess文件 301重定向URL重写[NC][R][F][L]是什么意思

    .htaccess中的[NC][R][F][L]几个标记是什么意思 NC: no case,就是说不区分大小写 R:redirect,重定向 F:forbidden,禁止访问 L:last,表示已经是 ...

  8. 刻录DVD_目录

    1.down.52pojie.cn (20160701) (1 in 5) 工具 2.down.52pojie.cn (20160701) (2 in 5) Android VM 6/7 3.down ...

  9. web设计经验<五>国外设计师总结的7个找灵感实用方法

    每个设计师不时会有创意灵感缺失.大脑一片空白的状态.盯着一个空白的屏幕,发愁着“好吧,我现在该做什么呢?该怎么做呢?”有些人喜欢静待,但这不是唯一的一个方法.焦虑的客户或者是你自己的不耐烦,都会让你无 ...

  10. 两个EXCEL文件对比去重

    两个EXCEL文件,A里面有10000条记录,B里面有4000条记录,A的记录包含了B里面所有的记录现在如何能把A里面没有包含B的6000条记录筛选出来? 那你要把两同时打开,比如book1 book ...