jQuery $('body').on()vs $('document').on()

原贴地址:https://www.sitepoint.com/jquery-body-on-document-on/

用新的jQuery函数替换.live()我已经看到了几种不同的方式来使用它。在这里我看看使用body或document作为事件委托中的绑定元素的主要区别。如果你是新的事件委托,它提供了将事件附加到尚未创建的元素的方法,同时将事件附加到同一类型的多个元素也具有较低的开销。有关更多信息,如果您想知道为什么.live()被弃用,请查看jQuery .live()与.on()的评论

大多数浏览器事件从文档中最深处的最内层元素(事件目标)冒泡或传播,直到文档元素和文档元素。在Internet Explorer 8及更低版本中,诸如change和submit之类的一些事件本身并不起泡,但是jQuery将这些事件打成泡泡并创建一致的跨浏览器行为。

资料来源:http://api.jquery.com/on/

使用body作为代表

为获得最佳性能,请将尽可能靠近目标元素的文档位置处的委派事件附加到该位置。避免过多使用document或document.body来处理大型文档上的委托事件。

HTML处理拖放事件:

$('body').on('dragover', filesDragged).on('drop', filesDropped);

使用文档作为代表

在加载任何其他HTML之前,文档元素在文档的头部是可用的,所以在那里附加事件而不等待文档准备就绪是安全的。
默认情况下,大多数事件从原始事件目标向上滚动到文档元素。

这是关于速度!

身体VS-document.png

从这个jsperf使用文档可以看出,比使用body作为事件委托更快。

身体VS-document2png

.on()和.delegate()之间的文件再次表现得更好,但差别不大 - 后者称之为前者。

jQuery源码。

delegate: function( selector, types, data, fn ) {
                return this.on( types, selector, data, fn );
        },

结论

问保罗爱尔兰人。但我想这没什么区别,我倾向于使用body,因为这是正式的jQuery API文档中的内容。

正确的用法:

例如,而不是:

$("body").on("click", "#commentForm .addNew", addComment)

使用:

$("#commentForm").on("click", ".addNew", addComment).

什么时候应该使用事件代表团?

1.当您为更多需要相同功能的元素绑定通用处理程序时。(例如:表格悬停)

*在这个例子中,如果你必须使用直接绑定来绑定所有的行,那么你最终会为该表中的n行创建n个处理程序。通过使用委托方法,您最终可以在一个简单的处理程序中处理所有这些。

2.在DOM中更频繁地添加动态内容(例如,从表格中添加/删除行)

为什么你不应该使用事件代表团?

1.与事件直接绑定到元素相比,事件委托比较慢。

*它比较目标选择器的每一个泡沫击中,比较将是昂贵的,因为它是复杂的。

2.无法控制事件冒泡,直到它遇到绑定的元素。

PS:即使对于动态内容,如果在内容插入到DOM之后绑定处理程序,则不必使用事件委托方法。(如果动态内容被添加不经常移除/重新添加)

进一步阅读:

事件委托是在元素实际存在于DOM之前编写处理程序的技术。这种方法有其自身的缺点,只有在有这样的要求时才应该使用。

资料来源:http://stackoverflow.com/questions/12824549/should-all-jquery-events-be-bound-to-document

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值