Javascript 正在删除主干视图,但DOM节点数一直在增加?

Javascript 正在删除主干视图,但DOM节点数一直在增加?,javascript,backbone.js,memory-management,garbage-collection,google-chrome-devtools,Javascript,Backbone.js,Memory Management,Garbage Collection,Google Chrome Devtools,我有一个内置于backboneJS的测验应用程序,我有三个视图。显示总体进度和后退/下一步按钮的快速查看。包含一组问题和每个问题的问题视图的页面视图 当用户进入测验的下一页时,我通过调用destroy函数删除当前页面视图,该函数调用页面本身和所有问题上的Backbone的remove()。(所有侦听器都附加了listenTo) 我希望这样做之后,DOM节点不会再反映在内存时间轴中。我从chromedev工具中附加了一个DOM节点数的视图,您可以看到它在进入新页面时上升 我还拍摄了一个堆快照,当我

我有一个内置于backboneJS的测验应用程序,我有三个视图。显示总体进度和后退/下一步按钮的快速查看。包含一组问题和每个问题的问题视图的页面视图

当用户进入测验的下一页时,我通过调用destroy函数删除当前页面视图,该函数调用页面本身和所有问题上的Backbone的remove()。(所有侦听器都附加了listenTo)

我希望这样做之后,DOM节点不会再反映在内存时间轴中。我从chromedev工具中附加了一个DOM节点数的视图,您可以看到它在进入新页面时上升

我还拍摄了一个堆快照,当我查看分离的DOM项时,它们都有一个项(页面的div容器),在保留树中只有一个项。我想这就是为什么他们没有被收集

任何人都能深入了解DOM节点数持续上升的原因吗

这也是我在PageView中的销毁功能:

destroy: function(){
    console.log("PageView :: destroy " + this)
    _.each(this.childViews, function(view){
        view.remove();
    });

    this.remove();
}

只要对象之间有任何引用,它们就没有资格进行垃圾收集。这些视图是“僵尸视图”。如何处理此类案件在这篇文章中得到了完美的解释:


view.remove()从DOM中删除视图,并调用stopListening 删除视图已侦听的所有绑定事件

您基本上删除了该视图的
事件:{}
和DOM。但是,监听
的事件会触发
并对事件进行建模,如

this.model.on('reset', this.render, this)

仍然存在,并且引用了您的观点,使其不符合垃圾收集的条件。

我知道这是一篇旧文章,但我遇到了同样的问题在chrome dev tools中录制时,会阻止垃圾收集器运行。必须通过单击GC按钮手动运行垃圾收集器

我创建节点,然后在创建10个节点时将它们全部删除。认为当从dom中删除节点时,节点计数应该重置。事实并非如此。然后我注意到顶部的GC按钮

我想你现在就可以把演示注入SO了。不需要小提琴。那很酷

var test=document.getElementById(“test”);
var stuff=document.getElementById(“stuff”);
test.addEventListener(“单击”,testFn);
var计数=0;
函数testFn(){
console.log('create'+count);
//创建一个新的div元素
//给它一些内容
var newDiv=document.createElement(“div”);
var newContent=document.createTextNode(“测试”+计数);
计数++;
appendChild(newContent);//将文本节点添加到新创建的div中。
appendChild(newDiv);
如果(计数=10){
while(东西,第一个孩子){
stuff.removeChild(stuff.firstChild);
}			
计数=0;
}	
};
页面应以14个节点开始。点击我。

这是有道理的,但是在我的情况下,我没有对任何事件使用“开”或“触发器”,因此我认为默认的删除函数应该足够了。如果您的视图/集合/模型中有任何listenTo,最好选择“this.model.off(null,null,this)”或“this.collection.off(null,null,this)”或“this.collection.off(null,null,this)”