【问题标题】:Using jQuery .on() for all events对所有事件使用 jQuery .on()
【发布时间】:2014-03-28 12:35:17
【问题描述】:

对每个事件都使用 jQuery 的 .on() 事件处理程序是否被认为是不好的做法?

以前,我的代码包含这样的脚本:

$('#cartButton').click(function(){
    openCart();
});

不过我最近开始使用InstantClick(一个 pjax jQuery 插件)。

现在我的脚本都不起作用了。我理解为什么会发生这种情况,但我不能用InstantClick.on('change', function(){ 标签包装我的代码,因为这意味着我的代码开始重复自己。例如,单击购物车按钮将多次运行openCart() 函数。所以为了解决这个问题,我将我的所有功能都更改为这样的:

$(document).on('click', '#cartButton', function(){
    openCart();
});

我很好奇这是否会增加加载时间并导致过度紧张。对我的代码中的每个事件都使用 on() 事件处理程序是不好的做法吗?

【问题讨论】:

  • 我想click() 函数在后台使用on() 函数。
  • on 用于委托,无论如何,您的代码是否使用“on”?
  • 尝试让点击事件更接近该元素所在的元素比将所有内容都连接到文档会更好。
  • 正如 epascarello 所说,您不需要将侦听器连接到文档。您可以在 JS 加载时使用 DOM 中存在的元素的第一个父元素。

标签: javascript jquery pjax event-delegation


【解决方案1】:

这根本不是坏习惯..

.on 是处理所有事件的首选方法,使用 .click 只是传递给 .on 方法的快捷方式..

如果您在此处查看(jquery 2.1.0 的未缩小源):https://code.jquery.com/jquery-2.1.0.js

这里有几个注意事项:

  1. 搜索此行:on: function( types, selector, data, fn, /*INTERNAL*/ one ) {

    这是 on 方法的函数定义,只是显示代码在做什么..

  2. 也搜索此行:jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick "

    这一行下面的代码正在映射所有可直接调用的快捷方式(如单击),并向您显示它们只是映射到“on”方法。

希望对你有帮助!!!

【讨论】:

  • 感谢您的详细回复!我想我很好奇使用$(document) 是否会对速度产生很大影响,因为我无法将它连接到更接近相关元素的任何东西。
  • 如果你总是从 $(document) 中搜索元素,而没有缓存 dom 变量,那么可能会有相当大的速度和内存损失(取决于你的 HTML 结构)。想一想:如果你总是从页面的根元素开始搜索,那么每次调用时它都必须遍历文档树来找到你正在寻找的节点,而不是使用更具体的东西ID 和类更接近您正在与之交互的元素。
【解决方案2】:

不,使用.on() 并不是一个坏习惯,实际上如果你检查source of the .click() function,你会发现它实际上调用了.on()

但是...而不是创建一个匿名函数,您应该简单地这样做,这样会更干净,而且速度会稍微快一些:

$(document).on('click', '#cartButton', openCart);

$('#cartButton').click(openCart);

【讨论】:

  • 快了几毫秒。
  • @epascarello 在我阅读了你的评论后我不得不用谷歌搜索...Microseconds:D
  • 当然,但它也更干净,并且可以减小文件大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2013-06-22
相关资源
最近更新 更多