0

在这里,我有一个节点列表和一个要从列表中删除的已识别节点(既从视图中又在内存中)。

var currentRow = dojo.query(this).parents("div").first()[0];
var parentDiv = dojo.query(currentRow).parents("div").first()[0];
var rowList = dojo.query(parentDiv).children();

问题是,

dojo.destroy(currentRow);

currentRow从视图中删除,但是当我循环时rowList,从firebug我仍然可以看到 rowList 的大小是原始大小而不减去一个删除,所以它似乎留在内存中,所以我们如何从 nodeList 中删除一个节点并返回新节点列表?

4

1 回答 1

1

销毁节点不会操作rowList数组,它只是从 DOM 树中删除节点。这意味着您将currentRow节点缓存rowList数组(以及currentRow变量)中。DOM 节点是 JavaScript 对象,当您从 DOM 树中删除它们时,如果它们无法访问,它们稍后会被 JavaScript 虚拟机收集起来。

在这种情况下,您只需要rowList在调用之后(或之后再次查询)dojo.destroy

var currentRow = dojo.query(this).parents("div").first()[0];
var parentDiv = dojo.query(currentRow).parents("div").first()[0];

dojo.destroy(currentRow);
currentRow = null;

var rowList = dojo.query(parentDiv).children();

如果currentRow全局可达,则将其设置为null.

看看它在行动:http: //jsfiddle.net/phusick/9MaUn/

阅读 Addy Osmani 的Writing Fast, Memory-Efficient JavaScript了解更多信息。

于 2013-03-21T06:53:59.080 回答