【问题标题】:Efficiency of .off() / .on() jQuery event handler binding combo.off() / .on() jQuery 事件处理程序绑定组合的效率
【发布时间】:2013-03-22 05:03:34
【问题描述】:

我有一个对象,当该对象被实例化时,它会将点击事件处理程序附加到<body>。 (附加过程发生在该对象的定义中)

当 URL 改变时(当用户导航到另一个页面时)这个对象被实例化。

此对象“每页”始终存在一种类型,如前所述,它会在页面更改时重新实例化,并且旧对象将不再存在。

附加过程如下:

var doc = $(document.body);

doc.off('click');

doc.on('click', function(){
   do_stuff();
});

我使用它是因为我注意到,如果只是附加事件处理程序,省略 .off(),当我浏览网站时,处理程序将在一次简单的单击时触发更多次(因为它是在每次实例化时附加/注册的该对象的)。

现在,我可以将此附加过程移到其他地方,例如在发生实例化的代码部分中,因此它不会依赖于该对象并确保处理程序只会附加一次,但这会剥夺我的权利访问一些局部变量,我必须使它们可以访问该代码部分。

我的问题是:这在性能方面会花费很多吗?我注意到这里有一些关于 stackoverflow 的帖子,强调这不是最佳的,但大多数示例显示的代码带有 .off() 或在.on()/binding 内部发生解除绑定。

重要提示:我使用的是backbone.js。这是一个“单页网站”。对象基本上是视图,它们的实例化发生在路由器中。

【问题讨论】:

  • 看起来你根本不需要解绑。使用所谓的实时事件,不要为所有这些重新初始化的混乱而烦恼。
  • 您能说得更具体些吗?
  • 是的,.off() 需要花费一些东西,但它是如此的微不足道,你不必为此失眠。 .off() 是确保元素在(重新)绑定事件处理程序之前以干净的表开始的理想方式。如果您需要选择性地取消绑定,那么您可以命名您的事件。见documentation for on()
  • 你能谈谈你为什么这样做吗?你想促进什么功能?为什么您使用正文点击事件,而不是将点击范围限定为将触发您想要的点击的元素?还是身体是点击有意义的唯一地方?更多信息将帮助我们弄清楚发生了什么,以及出于性能和其他原因是否有更好的方法来处理这个问题

标签: javascript jquery optimization backbone.js


【解决方案1】:

简而言之,不,使用off 并没有显着的性能损失。现在我不会在一堆圣经上发誓off 不可能引起性能问题,但我会说,在 100 个中有 99 个(可能更像是 1000 个中的 999 个或 10,000 个中的 9999 个)真实世界案例中你永远不必担心关闭会导致性能问题。

换句话说,off 不会导致明显的性能下降,除非您对它做了一些非常疯狂的事情,或者有一个非常疯狂的网站在不经意间做了一些非常疯狂的事情。

另一方面,不调用 off 可能会导致很多问题,与性能相关等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多