【发布时间】: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 foron()。 -
你能谈谈你为什么这样做吗?你想促进什么功能?为什么您使用正文点击事件,而不是将点击范围限定为将触发您想要的点击的元素?还是身体是点击有意义的唯一地方?更多信息将帮助我们弄清楚发生了什么,以及出于性能和其他原因是否有更好的方法来处理这个问题
标签: javascript jquery optimization backbone.js