删除Javascript中的元素列表
考虑以下代码。 在删除Javascript中的元素列表,javascript,Javascript,考虑以下代码。 在“videos\u list”elementi的内部,有一个在“couple”变量中得到的元素列表。我正试图删除所有属性与“list\u couple”属性不同的元素(为了测试,我只放了一个元素)。问题是,当他找到元素时,他不会删除找到的元素之后的其他元素 示例说明:考虑列表(“x”)、“r”、“t”、“b”、“h”、“p”)和 ID=“t”< /代码>。 他正在做的是(“,”t“,”b“,”h“,”p”) 他应该做(“,”t“,”t“,”t“,”t“,”或(“t”) 为什么在
“videos\u list”
elementi
的内部,有一个在“couple”变量中得到的元素列表。我正试图删除所有属性与“list\u couple”属性不同的元素(为了测试,我只放了一个元素)。问题是,当他找到元素时,他不会删除找到的元素之后的其他元素
示例说明:考虑列表<代码>(“x”)、“r”、“t”、“b”、“h”、“p”)和<代码> ID=“t”< /代码>。 他正在做的是
(“,”t“,”b“,”h“,”p”)
他应该做(“,”t“,”t“,”t“,”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);
var=0;
var interval=setInterval(函数(){
var list_couple=新数组(“2583521”),
点击次数=1,
视频=document.getElementById(“视频列表”),
couple=videos.getElementsByTagName(“a”);
var i=0;
while(i=单击){
间隔时间;
}
}, 1000);
我做错了什么?更新我刚刚回忆起这个问题,并意识到您的代码片段存在另一个问题(这也出现在@nicoserra的答案中)。删除节点时,耦合
节点列表将更新为实时列表。这将导致couple.length
减少,并跳过一些节点
<>我建议您考虑使用<代码>前缀和<代码>索引> <代码>,如果您可以依赖于它们对节点和数组迭代的支持。这只是迭代couple
中的所有锚点,如果元素具有匹配的ai
属性,那么它将从视频
父元素中删除该元素。在迭代时更新列表并不重要
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 );
}
}
我认为您的问题是因为I++应该超出for语句的范围
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++;
}
while(i
为什么不使用数组.过滤器
?你做错的是你在同时做每件事。在至少3个函数中用干净的名称将所有这些分开,事情应该自己澄清。请注意,正如我在更新的答案中提到的,还有第二个问题是couple。删除节点后,长度将发生变化