文章转载:http://www.jb51.net/article/67166.htmhtml
啃了一段日子的js相关了,学的过程当中发如今jQuery中绑定事件时,有人用bind(),有人用on(),有人用delegate(),还有人用live(),看代码的时候以为都实现功能了也就掀过去了,只是一直没彻底弄懂之间的区别,因而今天查了下资料,本身作个总结。jquery
之因此有这么多类型的绑定方法,是由于jQuery的版本更新的缘由,如on()方法就是1.7之后出现的。api
jQuery的事件绑定api页面上,提到live()方法已通过时,不建议使用。因此这里咱们主要就看下如下三个方法:bind()、delegate()、on()app
咱们准备一个html页面,用于各类类型事件绑定的测试。dom
<html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> </head> <body> <div> <button id="btn">添加新的p元素</button> <p>第一个p元素</p> <p>第二个p元素</p> <p>第三个p元素</p> <p>第四个p元素</p> <p>第五个p元素</p> </div> <script> $("#btn").click(function(){ $("div").append("<p>这是一个新的p元素</p>"); }); </script> </body> </html>
一个简单的页面,放置了一个div,div里面若干个p元素和一个按钮,点击按钮能够追加p元素。咱们下面将对页面上的p元素绑定click事件。性能
bind()测试
用法:this
$("div p").bind("click", function () { alert($(this).text()); })
这样就为全部div里的p元素都绑定了click事件,响应为弹出其内容。绑定很简单快捷,可是这里有两个问题:
第一个问题,这里用了隐式迭代的方法,若是匹配到的元素特别多的时候,好比若是我在div里放了50个p元素,就得执行绑定50次。对于大量元素来讲,影响到了性能。
可是若是是id选择器,由于id惟一,用bind()方法就很快捷了。
第二个问题,对于还没有存在的元素,没法绑定。点击页面上的按钮,将动态添加一个p元素,点击这个p元素,会发现没有动做响应。
用delegate方法就能够解决这两个问题了。spa
另外提一下,bind()方法还有一种简写方式,上面的代码还能够换成:.net
$("div p").click(function () { alert($(this).text()); })
delegate()
用法:
$("div").delegate("p", "click", function () { alert($(this).text()); });
这种方式采用了事件委托的概念。不是直接为p元素绑定事件,而是为其父元素(或祖先元素也可)绑定事件,当在div内任意元素上点击时,事件会一层层从event target向上冒泡,直至到达你为其绑定事件的元素,如此例中的div元素。冒泡的过程当中,若是事件的currentTarget与选择器匹配时,就会执行代码。
这样就解决了用bind()方法的上面两个问题,不用再一个个地去为p元素绑定事件,也能够为动态添加进来的p元素绑定。甚至,若是你将事件绑定到document上,都不用等document准备好就可执行绑定。
这样,绑定是容易了,可是调用的时候也可能出现问题。若是事件目标在DOM树中很深的位置,这样一层层冒泡上来查找与选择器匹配的元素,又影响到性能了。
on()
on()实际上是将之前的绑定事件方法做了统一,查看jQuery无压缩的源码(我这里看的版本是1.11.3),能够发现不管bind()仍是delegate()其实都是经过on()方法实现的,只是参数不一样罢了。
代码以下:
bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); } undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); }
上面的例子中,用on()能够做以下绑定:
$("div").on("click","p",function(){ alert($(this).text()); })
官方文档建议:
As of jQuery 1.7, the .on() method is the preferred method for attaching event handlers to a document.
尽可能使用on()来绑定事件。
移除事件
对应于bind()、delegate()和on()绑定方法,其移除事件的方法分别为:
$( "div p" ).unbind( "click", handler ); $( "div" ).undelegate( "p", "click", handler ); $( "div" ).off( "click", "p", handler );
除了像上面这样移除指定的事件绑定以外,还能够不传入参数,移除全部事件绑定,这里就不一一列出了,jQuery的官方文档写得很是详细。
总结
1.选择器匹配到的元素比较多时,不要用bind()迭代绑定
2.用id选择器时,能够用bind()
3.须要给动态添加的元素绑定时,用delegate()或者on()
4.用delegate()和on()方法,dom树不要太深
5.尽可能使用on()
以上所述就是本文的所有内容了,但愿你们可以喜欢。