删除Javascript中的元素列表

时间:2013-12-02 14:40:19

标签: javascript

请考虑以下代码。 "videos_list"元素i内部有一个我在“couple”变量中获得的元素列表。我正在尝试删除属性"ai""list_couple"不同的所有元素(以测试我只放置一个元素)。问题是,当他找到元素时,他不会删除找到元素后的其他元素。

说明这个想法的示例:考虑列表("x", "r", "t", "b", "h", "p")id="t"

他正在做的是("_", "_", "t", "b", "h", "p")

他应该("_", "_", "t", "_", "_", "_")("t")

为什么“i”的值在找到元素后在0和1之间切换?我在示例中看到了alert()函数。问题出在“while”循环中,我相信。

var clicked = 0;
var interval = setInterval(function( ) {

    var list_couple = new Array("2583521"),
    clicks = 1,
    videos = document.getElementById( "videos_list" ),
    couple = videos.getElementsByTagName( "a" );

    var i = 0;
    while( i < couple.length ) {
        var flag = 0;
        //alert(i);// To see the value of the i.
        for(j = 0; j < list_couple.length; j++) {
            if((couple[i].getAttribute( "ai" )) == list_couple[j]) {
                flag = 1;// Element found.
                i++;
                break;
            }
        }
        if( !flag ) {
            videos.removeChild( couple[i].parentNode );
        }
    }

    document.getElementById('btnMoreVideos').click();// Click on the button.
    clicked++;
    if(clicked >= clicks) {
        clearInterval( interval );
    }
}, 1000);

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我认为你的问题是因为i ++应该超出你的陈述范围。

while( i < couple.length ) {
    var flag = 0;
    //alert(i);// To see the value of the i.
    for(j = 0; j < list_couple.length; j++) {
        if((couple[i].getAttribute( "ai" )) == list_couple[j]) {
            flag = 1;// Element found.
            //i++;
            break;
        }
    }
    if( !flag ) {
        videos.removeChild( couple[i].parentNode );
    }
    i++;
}

答案 1 :(得分:0)

更新我刚刚回忆起这个问题并意识到你的代码片段存在另一个问题(@ nicosierra的答案中也存在这个问题)。在删除节点时,couple节点列表将更新,因为它是实时列表。这将导致couple.length减少并跳过一些节点。

如果您可以依赖对节点和数组迭代的支持,我建议您考虑使用forEachindexOf。这只是迭代couple中的所有锚点,如果元素具有匹配的ai属性,那么它将从videos父项中删除该元素。如果在迭代时更新列表

,则无关紧要
var list_couple = ["2583521"],
    videos = document.getElementById( "videos_list" ),
    couple = videos.getElementsByTagName( "a" );

Array.prototype.forEach.call(couple, function(node) {//iterate node list
    if(list_couple.indexOf(node.getAttribute( "ai" )) >= 0) {
        videos.removeChild( node.parentNode );
    }
});

或者您也可以向后迭代节点

for (var i = couple.length-1; i >= 0; i--) {
    if(list_couple.indexOf(couple[i].getAttribute( "ai" )) >= 0) {
        videos.removeChild( couple[i].parentNode );
    }
}