2013-12-10 27 views
0

這是我的代碼以清除給定DivElement孩子:安全明確一個的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的孩子?

回答

10

想想這個循環會發生什麼。讓我們帶三個孩子的div:

int count = rows.getChildCount();

此時,顯然count是3,所以我們從i開始的零循環開始。現在

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,並檢查列表是否爲空 - 如果不是,則刪除第零項。這是有用的,前進和刪除項目。簡單地說:

    while (rows.hasChildNode()) { 
        rows.removeChild(rows.getFirstChild()); 
    } 
    
  • 向後走在名單 - 啓動與索引列表中的最後一項,並減去一個每一步。這樣,每當你刪除一個項目,你不必擔心是否有下一個項目,因爲總是有一個以前的項目,只要你高於零! - 在大多數情況下,我們可以簡單地調用setInnerHTML("")

    • 元素包含HTML:這尤其適用於HTML

      for (int i = count; i >= 0; i--) { 
          rows.removeChild(rows.getChild(i)); 
      } 
      

    幾個。請注意,在處理表格時,這在IE中存在問題。

    rows.setInnerHTML(""); 
    
  • GWT 2.6有在元件的新方法,具體Element.removeAllChildren()。只需在你的div元素上調用這個方法即可。此方法或多或少運行while循環上面討論:

    rows.removeAllChildren(); 
    
+0

Ghaa,我想10該回答;我怎麼只能+1呢? –

+0

升級對我來說是最好的解決方案。謝謝你的提示 – xybrek