我试图让用户上传一个项目列表来过滤搜索结果表。问题是并非所有在过滤器列表中没有值的行都会在第一次被删除,所以为了让程序按照我想要的方式执行,我需要多次运行它。
附加代码有效,但我想删除'badWorkAround()'函数
<div align="center">
<script>
function readList() {
var origText = document.getElementById("CusipTextArea").value;
var filterList = origText.split("\n");
var table = document.getElementById("resultsTable");
var rows = table.getElementsByTagName("tr");
for(i = 1; i < rows.length; i++) #first row has the column names so I start at i=1
{
var Found = '0'
for(j = 0; j < filterList.length; j++)
{
if (rows[i].innerHTML.indexOf(filterList[j]) > 0){
Found = '1'
break;
}
}
if (Found != '1'){rows[i].remove();}
}
}
function badWorkAround(){
readList();
readList();
readList();
readList();
readList();
readList();
readList();
readList();
readList();
}
</script>
<textarea id=TextArea>Paste in a list to filter by. One per line please.</textarea><BR>
<button type="button" onclick="return badWorkAround();">Filter by List</button>
</div>
答案 0 :(得分:6)
NodeLists(与getElementsByTagName一样)是“实时”,这意味着它们可以随时反映DOM 的当前状态。
您正在循环TR节点,然后在执行此操作时删除其中一些节点。让我们说你在你的循环中的索引1(第二次循环迭代),并删除该节点 - 所有后续节点“向上滑动”一个位置,所以以前是索引2的节点现在已经索引1,那是什么3现在是2,等等。但是由于你也在每个循环中增加一个循环计数器i
,在下一次迭代中你将访问现在索引2处的节点(以前的3) - 并且之前位置2 的节点甚至不再处理。
解决此问题的最简单方法:将节点向后,从rows.length - 1
循环到0
(然后减少您的循环计数器变量,明显)。因为如果删除列表 end 的节点,则不会影响之前的任何节点的位置。