【发布时间】:2012-07-20 08:09:00
【问题描述】:
所以我注意到我的应用程序在经过长时间使用后变慢了。特别是当我创建许多视图时,这些视图都是长列表中的每个项目。我原以为通过使用 view.remove() 删除这些视图将有助于解决问题,但是当它们从页面中删除时,我注意到 Chrome 的时间轴显示我的 DOM 节点数没有减少。我添加的每个视图都会继续增加这个数量。事实上,似乎唯一能减少此节点数的就是页面刷新。
这对我来说感觉不对,我觉得我搞砸了一些非常基本的东西,因为问题似乎出现在我所有的观点中,而不仅仅是这些观点。这些视图列表的发生速度要快得多,因为它们太多了。
有人对我应该寻找什么有任何建议吗?什么样的原因会导致这种行为?
我会提供代码,但我不知道有什么帮助。
TL;DR - View.remove() 正在从页面中删除视图,但我的 DOM 节点计数继续上升,并且永远不会下降。
【问题讨论】:
-
您是否检查过这是否可以在其他浏览器中重现?可能是 chrome 的网络检查器上的错误。少于 1200 个 Dom 节点是完全可以的,当它超过时,您必须检查哪些视图没有显示并立即删除它们
-
您的视图是否在监听任何模型或集合事件?这可能会导致视图中的
this.el和this.$el泄漏。 -
@Deeptechtons 我希望我能说这是 Chrome 检查器的问题,但我很确定最薄弱的环节就在这台计算机前面。 ;-) 需要注意的是,我认为我应该澄清我的 DOM 元素正在被删除。 document.getElementsByTagName("*").length 之类的东西会根据我是添加还是删除视图而导致适当的计数更改。我使用 Derick Bailey 的僵尸移除思想,每个视图都有一个 close 功能,可以成功移除和取消绑定事件。所以我的事件下降了,观点消失了(至少在表面上)。但节点数仍然存在。
-
@muistooshort 是的。我的各种观点确实听模型和集合。我还有一个扩展的 close() 方法,它同时调用 remove() 和 onClose()。 onClose() 基本上具有所有 unbind('event') 操作来撤消我对各种模型和集合所做的任何绑定。但是您能否详细说明一下您对通过 this.el/$el 进行泄漏的含义?
-
如果视图仍在侦听模型,则模型具有对视图的引用,视图将在其
el和$el属性中引用 DOM 元素。这意味着模型对元素有间接引用,并且您有僵尸。
标签: javascript jquery dom backbone.js