想想這個循環會發生什麼。讓我們帶三個孩子的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("")
幾個。請注意,在處理表格時,這在IE中存在問題。
rows.setInnerHTML("");
GWT 2.6有在元件的新方法,具體Element.removeAllChildren()
。只需在你的div元素上調用這個方法即可。此方法或多或少運行while循環上面討論:
rows.removeAllChildren();
Ghaa,我想10該回答;我怎麼只能+1呢? –
升級對我來說是最好的解決方案。謝謝你的提示 – xybrek