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

xyb*_*rek 0 java gwt

这是我清除给定孩子的代码DivElement:

    int count = rows.getChildCount();
    for (int i=0 ; i < count; i++){
        Node child = rows.getChild(i);
        rows.removeChild(child);
    }
Run Code Online (Sandbox Code Playgroud)

但是,我可以看到它抛出:

Caused by: java.lang.AssertionError: Child index out of bounds
Run Code Online (Sandbox Code Playgroud)

如何安全地删除一个孩子DivElement

Col*_*rth 10

想想这个循环中会发生什么.让我们带三个孩子的div:

int count = rows.getChildCount();

在这一点上,显然count是3,所以我们从零开始通过for循环i.

Node child = rows.getChild(0);
rows.removeChild(child);
Run Code Online (Sandbox Code Playgroud)

现在,rows只有2个项目,但计数仍然是3.下一步循环,i是一个.

Node child = rows.getChild(1);
rows.removeChild(child);
Run Code Online (Sandbox Code Playgroud)

这是列表中的第二个项目,包含两个项目 - 列表中的最后一项,但不是要删除的最终项目.当我们再次进入循环时,i是两个,但只剩下一个项目了!

Node child = rows.getChild(2); // Exception!
Run Code Online (Sandbox Code Playgroud)

在一般情况下,修改列表时您遍历它,也有一些很好的办法.

  • 将循环修改为仅在删除项目时递增.这是一种常见的方法,当您需要向前走(并使用列表的顺序)但只需要删除一些项.
  • 不要使用for循环,而只是a while,并检查列表是否为空 - 如果不是,请删除第0项.这对于前进并删除每个项目非常有用.简单地说:

     while (rows.hasChildNode()) {
       rows.removeChild(rows.getFirstChild());
     }
    
    Run Code Online (Sandbox Code Playgroud)
  • 向后走列表 - 从索引开始作为列表中的最后一项,并在每一步中减去一个.这样,每当你删除一个项目时,你都不需要担心是否有下一个项目,因为总有一个前一个项目,只要你高于零!

    for (int i = count; i >= 0; i--) {
      rows.removeChild(rows.getChild(i));
    }
    
    Run Code Online (Sandbox Code Playgroud)

还有一些特别适用于HTML:

  • 元素包含html - 在大多数情况下,我们可以简单地调用setInnerHTML("").请注意,在处理表时,这在IE中存在问题.

    rows.setInnerHTML("");
    
    Run Code Online (Sandbox Code Playgroud)
  • GWT 2.6在Element中有一个新方法,具体来说Element.removeAllChildren().只需在div元素上调用此方法即可.这个方法或多或少运行上面讨论的while循环:

    rows.removeAllChildren();
    
    Run Code Online (Sandbox Code Playgroud)