安全地清除(或移除儿童)DivElement

时间:2013-12-10 04:31:43

标签: java gwt

这是我清除给定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的孩子?

1 个答案:

答案 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();