这几个都是jquery中事件绑定的方法,之所以有这么多类型的绑定方法,是因为jQuery的版本更新的原因,如on()方法就是1.7以后出现的。
其中live()方法已经过时,不建议使用。所以这里我们主要就看下以下三个方法:bind()、delegate()、on()
<button id="btn">添加新的p元素</button>
<div>
<p>p1</p>
<p>p2</p>
<p>p3</p>
<p>p4</p>
<p>p5</p>
</div>
<script>
$('#btn').click(function(){
$('div').append('<p>new p !</p>');
})
</script>
一个简单的页面,放置了一个div,div里面若干个p元素和一个按钮,点击按钮可以追加p元素。我们下面将对页面上的p元素绑定click事件。
bind()函数用于为每个匹配元素的一个或多个事件绑定事件处理函数。
绑定一个事件
$('div p').bind('click',function(){
alert($(this).text());
})
绑定多个事件
$('div p').bind({
'click':function(){
alert($(this).text());
},
'mouseover':function(){
$(this).css('color','red');
}
})
这里,我们发现两个问题
问题一:对于动态新增加p 绑定不上事件
问题二:运用了隐式迭代(也就是用户看不到,内部悄悄的遍历了一遍所有的div中的p元素),这时如果p元素很多,无疑会影响性能,但是如果是id选择器就会很快捷,因为id是唯一的
这里再补充一下,其实bind还有一种简写的方法 就是直接$().事件名 这时我们执行下面的代码 和bind方法没有区别
$('div p').click('click',function(){
alert($(this).text());
})
以上问题,我们用delegate()可以解决
delegate()函数用于为指定元素的一个或多个事件绑定事件处理函数。
即使是执行delegate()函数之后新添加的元素,只要它符合条件,绑定的事件处理函数仍然对其有效。这种方式采用了事件委托的概念,也就是利用事件冒泡的原理让父元素代替子元素触发事件。
$("div").delegate("p", "click", function () {
alert($(this).text());
});
当想添加多个事件时
$('div').delegate('p','click mouseover',function(e){
if(e.type=='click'){
alert($(this).text());
}
else if (e.type=='mouseover') {
$(this).css('color','blue');
}
})
这里不是直接为p元素绑定事件,而是为其父元素(或祖先元素也可)绑定事件,当在div内任意元素上点击时,事件会一层层从event target向上冒泡,直至到达你为其绑定事件的元素,如此例中的div元素。冒泡的过程中,如果事件的currentTarget与选择器匹配时,就会执行代码。 这样就解决了用bind()方法的上面两个问题,不用再一个个地去为p元素绑定事件,也可以为动态添加进来的p元素绑定。甚至,如果你将事件绑定到document上,都不用等document准备好就可执行绑定。 绑定是容易了,但是调用的时候也可能出现问题。如果事件目标在DOM树中很深的位置,这样一层层冒泡上来查找与选择器匹配的元素,又影响到性能了。
iq再最终使用了一个方法统一了事件的添加方式——on()
on()函数用于为指定元素的一个或多个事件绑定事件处理函数。
$('div').on('click','p',function(){
alert($(this).text());
})
这里你一定会疑惑on()和delegate()的区别了
PS: 两者区别是seleter和events顺序不同 也就是‘’click‘’和‘’p‘’的顺序不同,不过1.7开始delegate()已经被on()代替了。so。。。我们只需要用on()就万事大吉了。
这里再补充一下三个的移除事件
对应于bind()、delegate()和on()绑定方法,其移除事件的方法分别为:
$( "div p" ).unbind( "click", handler );
$( "div" ).undelegate( "p", "click", handler );
$( "div" ).off( "click", "p", handler );
除了像上面这样移除指定的事件绑定之外,还可以不传入参数,移除所有事件绑定,这里就不一一列出了,jQuery的官方文档写得非常详细。
总结
1.bind()方法和$().事件名方法相同,不支持动态元素的事件绑定,不支持事件委托
2.delegate()和on()除了传参不同,其他都相同,是jq中的事件委托
3.匹配元素多时不要用bind()
4.尽量使用on()