请考虑以下代码。
"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);
我做错了什么?
答案 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
减少并跳过一些节点。
如果您可以依赖对节点和数组迭代的支持,我建议您考虑使用forEach
和indexOf
。这只是迭代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 );
}
}