jQuery事件绑定on()、live()、bind()与delegate()

这几个都是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()

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值