0

我试图让用户上传一个项目列表来过滤搜索结果表。问题是,并非所有在过滤器列表中没有值的行都第一次被删除,所以为了让程序执行我想要的操作,我需要多次运行它。

附加的代码有效,但我想删除'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>
4

1 回答 1

6

NodeLists(就像你用 getElementsByTagName 得到的)是“活的”,这意味着它们随时反映 DOM 的当前状态。

您正在遍历 TR 节点,然后在这样做的同时删除其中的一些节点。假设您在循环(第二次循环迭代)中处于索引 1,并删除该节点 - 所有后续节点“向上滑动”一个位置,因此以前索引为 2 的节点现在具有索引 1,而3 现在是 2,依此类推。但是由于您还在i每个循环中将循环计数器增加一个,因此在您的下一次迭代中,您将访问现在位于索引 2(以前为 3)的节点 - 以及位于位置 2 的节点before甚至不再处理。

这个问题的最简单解决方案:向后循环节点,从rows.length - 10(然后显然减少循环计数器变量)。因为如果您删除列表末尾的节点,则不会影响其之前任何节点的位置。

于 2013-08-07T14:03:20.263 回答