javascript - jq事件绑定
迷茫
迷茫 2017-04-10 17:47:05
[JavaScript讨论组]
$(document).on('click',function(event){
     if($(event.target).is('[data-btn-rank]')){
         alert("ppp")     
     }
})
$("body").on('click','[data-btn-rank]',function(event){
     alert("ppp")            
})

这两种绑定方法效果完全一样吗?还是有其他区别?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(5)
迷茫

(楼上都在说些什么。。。以下正确答案)

说在前面:
一般不会把事件绑定到document

假设你的问题是这样:

$('body').on('click', function(event) {
    /* some code */
});
$('body').on('click', '[data-btn-rank]', function(event) {
    /* some code */        
});

共同点
Function对象都是绑定在body元素上

不同点(即区别):
前者:点击body时触发
后者:点击[data-btn-rank]元素,冒泡到body时触发

以上。

ringa_lee

selector:一个选择器字符串用于过滤器的触发事件的选择器元素的后代。如果选择的< null或省略,当它到达选定的元素,事件总是触发。

怪我咯

当body是异步加载的页面时候,用document方法才可以

阿神

在某些情况异步加载 body,比如 rails 的 turbolinks,第二个可能就会失效,常规的

$(obj).on('click', function() {
  xxxx
})

也是可能失效或者多次绑定的,但是绑定在 document 上就不会有问题。


实测了一下,turbolinks 下第二个写法会出问题,有没有解决方法不确定,因为我一直是绑定在 document 上。

$(document).on('click', '.article-title', function() {
  console.log('document')
})
$('body').on('click', '.article-title', function() {
  console.log('body')
})
怪我咯

效果是一样的。
document其实代表的是html标签所包围的区域,和body有本质区别,但是在实际的实现上其实这两种方法是差不多的,都是事件委托通常选择的元素。且第二个参数存在的时候.o()绑定事件是通过事件监听机制,也就是说给即便有[data-btn-rank]属性的元素还没有加载出来,也会在加载成功的时候绑定上。
而第一种方法事件是委托给document,在document上的click事件触发的时候会访问触发这个事件的源元素来执行相应事件,因此也是和有[data-btn-rank]属性的元素的加载与否不冲突的。
所以在实现上效果一样。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号