Javascript函数没有第一次获取所有值

时间:2013-08-07 13:58:03

标签: javascript function

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

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

1 个答案:

答案 0 :(得分:6)

NodeLists(与getElementsByTagName一样)是“实时”,这意味着它们可以随时反映DOM 的当前状态

您正在循环TR节点,然后在执行此操作时删除其中一些节点。让我们说你在你的循环中的索引1(第二次循环迭代),并删除该节点 - 所有后续节点“向上滑动”一个位置,所以以前是索引2的节点现在已经索引1,那是什么3现在是2,等等。但是由于你也在每个循环中增加一个循环计数器i,在下一次迭代中你将访问现在索引2处的节点(以前的3) - 并且之前位置2 的节点甚至不再处理。

解决此问题的最简单方法:将节点向后,从rows.length - 1循环到0(然后减少您的循环计数器变量,明显)。因为如果删除列表 end 的节点,则不会影响之前的任何节点的位置。