这是我清除给定DivElement
的孩子的代码:
int count = rows.getChildCount();
for (int i=0 ; i < count; i++){
Node child = rows.getChild(i);
rows.removeChild(child);
}
然而,我可以看到它抛出:
Caused by: java.lang.AssertionError: Child index out of bounds
如何安全地删除DivElement
的孩子?
答案 0 :(得分:10)
想想这个循环中会发生什么。让我们带三个孩子的div:
int count = rows.getChildCount();
此时,显然count
为3,因此我们从i
开始执行for循环。
Node child = rows.getChild(0);
rows.removeChild(child);
现在,rows
只有2个项目,但计数仍然是3.在循环的下一步,i
就是一个。
Node child = rows.getChild(1);
rows.removeChild(child);
这是列表中的第二个项目,包含两个项目 - 列表中的最后一项,但不是要删除的最终项目。当我们再次进入循环时,i
是两个,但只剩下一个项目了!
Node child = rows.getChild(2); // Exception!
一般情况下,当您将列表修改为时,您会迭代它,有一些好的方法。
不要使用for
循环,只需while
,并检查列表是否为空 - 如果不是,请删除第0项。这对于前进并删除每个项非常有用。简单地说:
while (rows.hasChildNode()) {
rows.removeChild(rows.getFirstChild());
}
向后走列表 - 从索引开始作为列表中的最后一项,并逐步减去一个。这样,每当你删除一个项目时,你都不必担心是否有下一个项目,因为总有一个前一个项目,只要你高于零!
for (int i = count; i >= 0; i--) {
rows.removeChild(rows.getChild(i));
}
还有一些特别适用于HTML:
元素包含html - 在大多数情况下,我们只需调用setInnerHTML("")
即可。请注意,在处理表时,这在IE中存在问题。
rows.setInnerHTML("");
GWT 2.6在Element中有一个新方法,特别是Element.removeAllChildren()
。只需在div元素上调用此方法即可。这个方法或多或少运行上面讨论的while循环:
rows.removeAllChildren();