2013-03-21 67 views
2

有一堆有关如何删除所有“特殊”处理程序从要素问题(如的onclick)删除所有处理程序,或从一个元素清除所有事件等从所有元素

  1. How to remove all Click event handlers in Jquery
  2. Jquery: how to release all event handlers, dom changes?

这个问题有点宽泛。我们在IE7和IE8下面的asp.net网站面临着巨大的内存泄漏,并且缩小这些泄漏的一个调整是解除页面上所有元素的所有事件。基本上这个:

$('*').off(); 

现在,我们正在努力提高应用程序的性能,毫不奇怪,这个特定的行是热点之一。

所以,问题是:有没有什么方法可以更有效地达到相同的结果(明确地从文档中的所有元素中删除所有处理程序)?

不走的选择:

  • “重新加载页面” - 内存泄漏保留这种方式。
  • “每次你附加处理时间,你将它存储在阵列” - 有太多这样的地方

我在想的是使用一些jQuery的内部(甚至非公开API)利用附加的处理程序来检测元素。但它略高于我目前使用jQuery的能力。如果有帮助,我们将针对jQuery 1.7.1。

+0

我以前做过这个。我的解决方案是保留一个全局数组来存储对元素的引用。所以每次我绑定一些东西的时候,我都会添加一个对数组的引用。然后,当我需要时,通过阵列循环并逐个解除绑定。它是一个乏味的解决方案。想知道更好的方法来做到这一点。 – AlexCheuk 2013-03-21 21:33:34

+0

@AlexCheuk,这可能很麻烦。我希望我们可以遍历所有使用jQuery的文件,并修改处理程序附件以将处理程序附加到某个数组中......但实际上,我们有一个长期生活的产品,其中的附件遍布数百个文件。几乎没有自动化测试。即使没有考虑到开发工作,我们的QA团队也会杀了我们,如果我们这样做的话:)需要一个全球解决方案,不幸的是,蛮力不是一种选择。 – J0HN 2013-03-22 01:26:03

回答

1

我想你可以创建类似于hasEvent的东西来检测事件,但我怀疑你的问题比在没有事件的元素上调用.off()更多地穿过DOM。你可以测试它来确保。

根据应用程序的性质,您可以通过调整选择器来更精确地定位元素,从而获得一些性能。
请参阅:http://www.artzstudio.com/2009/04/jquery-performance-rules/

另一个想法是override jQuery functions是添加事件处理程序,所以你可以填充你的供以后使用数组。它不需要修改你的数百个文件,但仍然会给你更直接的访问权限以供日后操作。

+0

是的,实际上遍历'$('*')'会比'off()'消耗更多的资源。调整选择器已经过验证,因为我们有处理a,div,span,input,img,li,td,table,tr等的几乎没有用处 - 几乎可以在页面上使用任何类型的标记。更不用说类和ID :)。重载jQuery可能会诀窍,明天会尝试。 – J0HN 2013-03-22 02:42:34