2010-09-20 23 views
0

這很奇怪,即時嘗試清除我的選擇列表,正好有一半正在清除,而不是一切。它也是所有其他被遺忘的物品。我沒有在這裏包括數據,但只是選擇列表的設置。數據是10項,只有5項被刪除。 UniList調用DeleteAll。第一個提醒打印出「10」和第二打印出「5」HTML JS只有一半的選擇列表正在被刪除?

DID是剛剛的document.getElementById()

function DeleteAll(string) { 

     var i; 
     var list = DID(string); 

     alert(DID(string).options.length); 

     for (i = 0; i<list.options.length; i++) { 
      list[i] = null; 
     } 
     alert(list.options.length); 
     alert("finished deleting"); 
} 

<select size='12' name='UniList' id='UniList' style='width:180px;' onclick=changeuni('UniList','Uni')> 
    <option value=''></option> 
    <option value=''></option> 
    <option value=''></option> 
</select> 
+0

您沒有提供en足夠的信息在這裏。什麼是DID功能? – irishbuzz 2010-09-20 11:19:30

+0

哦,對不起,它只是調用document.getelementbyid(),即時獲取HTML選擇對象罰款 – Tom 2010-09-20 11:22:22

回答

5

list.optionsHTMLOptionsCollection被假定爲live

注:集合在HTML DOM被認爲是活這意味着當底層文檔發生更改時它們會自動更新。

因此,與每個迭代一個項目被刪除,文件被更新,以便list.options,因此list.options.length過更新。因此,不是除去列表中的第一個,第二個,第三個等選項,則實際刪除第一個,第三個,第五個等選項。

使用list.options[0],而不是總是刪除第一個選項:

while (list.options.length > 0) { 
    list.options[0] = null; 
} 

或者從背後取下選項:

for (i = list.options.length-1; i>=0; i--) { 
    list.options[i] = null; 
} 

順便說一句:在HTMLSelectElement有一個remove method通過刪除一個選項,它index:

while (list.length > 0) { 
    list.remove(0); 
} 
+0

嘿謝謝,名單[0]沒有工作,但遞減指數做 – Tom 2010-09-20 11:42:06

+0

@湯姆:嗯,不應該是'列表.options [0]'因爲你想刪除選項? – Gumbo 2010-09-20 11:45:01

0

嘗試從選擇列表開始結束循環。用戶界面的嫌疑犯,因爲你刪除他們重新排序數組,這樣,一旦你刪除了你的下一個索引的一半,然後是頂部。例如,如果你有10個項目,然後刪除5後,它會嘗試與索引6刪除項目,但你只有5列表長度,這樣將無法正常工作......

所以基本上嘗試:

for (i = list.options.length-1 ; i>=0; i--) { 
     list[i] = null; 
    } 

我想我在那裏得到了我的索引,但相應地調整了循環,以防萬一我弄錯了。

編輯:

我意識到,還有一個更好的方法來刪除。只需使用list.options.length = 0將清除您的列表。我已經把一些例子放入jsFiddle中,這樣你就可以看到它們在運行(所以我試驗了它們的工作)。

http://jsfiddle.net/HUvA2/3/ - 第一個按鈕運行你的方法(你會看到它刪除每一個其他條目),第二個運行我可以看到的修改後的循環擺脫它們。 「最好」的按鈕即可設置列表長度爲0 :)

4

你可以只是

function DeleteAll(listId) { 
    var list = document.getElementById(listId); 
    list.options.length=0; 
} 

甚至

function DeleteAll(listId) { 
    document.getElementById(listId).options.length=0; 
} 

如果你還是喜歡更換現有DeleteAll功能使用DID()你可以交換它

1

這可能是一個選項,以及

while (list.options.length > 0) { list[0] = null; }

相關問題