2014-06-15 106 views
0

http://jsfiddle.net/83m3B/的javascript:無法刪除陣列

我想要通過使用data-object-id屬性刪除陣列的一些元件的一些元件。 但是,當我使用它,循環不按預期運行。它似乎每次都跳過一個元素。

var banIds = ["111", "222", "333"]; 
function toggle_visibility(className) { 
    var elements = document.getElementsByClassName(className), 
    n = elements.length; 
    for (var i = 0; i < n; i++) { 
    var e = elements[i]; 
    var statusID = e.getAttribute('data-object-id'); 
    if ($.inArray(statusID, banIds) !== -1) { 
     e.remove(); 
    } 
    } 
} 

什麼問題?我該如何解決它?

+1

打開控制檯並查看錯誤。 – dfsq

+0

我看不到你在哪裏設置'banIds' – webkit

+0

使用拼接...... – user3508453

回答

3

只要jQuery是可以接受的,沒有理由不使用它的設施:

function toggle_visibility(className) { 
    $('.' + className).filter(function() { 
     return $.inArray($(this).data('object-id'), banIds) !== -1; 
    }).remove(); 
} 
+0

但是我在使它運行時遇到了麻煩。 http://jsfiddle.net/5X3jR/2/ – cqcn1991

+0

這裏是我的jQ版本,仍然有麻煩。 http://jsfiddle.net/6D6Ly/ – cqcn1991

+0

@ cqcn1991:你爲什麼改變我的代碼使用'.each()'? http://jsfiddle.net/6D6Ly/1/ - 這是可以工作的代碼 – zerkms

2

使用while循環進行刪除。 For週期跳過元素,因爲它們已經被刪除,其他元素在數組中有另一個位置索引。

還是這樣寫:

if ($.inArray(statusID, banIds) !== -1) { 
    e.remove(); 
    i--; 
} 

,不使用n,因爲elements.length的變化週期。

0

這從刪除索引列表元素時是典型的錯誤。
您錯過了刪除元素時刪除後的所有元素將在index中移動到index-1的事實。因此,下一個元素接收的索引與刪除的索引相同,但是對於循環,仍然會增加索引,並在刪除後跳過一個元素。
避免此問題最簡單的方法是向後運行循環:

for (var i = n-1; i >= 0; i--) { 
    var e = elements[i]; 
    var statusID = e.getAttribute('data-object-id'); 
    if ($.inArray(statusID, banIds) !== -1) { 
     e.remove(); 
    }