指数或大小为负数或大于允许数量(非负指数)

时间:2011-03-15 14:27:26

标签: javascript loops

使用Firefox时,我不断收到此代码块主题行中描述的错误:

for(var i = 0; i < tables.length; i++)
{
    var j = rows.length - 1;
    while(j--)
    {                   
        if(hideDP && tables[i].innerHTML.indexOf(">D<") != -1)
        {   
            if(!platTag && !soulSilverTag && pearlTag)
            {
                tables[i].deleteRow(j);//ERROR IS ON THIS LINE
            }
        }

    }//end while loop (rows)
}//end for loop (tables)

我怀疑这个错误是因为我对制作反向循环有些新意,但我特意在这个实例中做了一个反向循环,因为它更容易从表中删除行。另请注意,j类似于24且i为0,因此它们是非负的。有人可以为我解释一下吗?

编辑:完整代码can be found here

2 个答案:

答案 0 :(得分:5)

严格处理当前发布的代码,以下是我看到的问题:

  1. 发布的代码看起来不完整。 rows在哪里被初始化?这可能会导致声明错误。

  2. 鉴于while(j--); var j = rows.length - 1;行不正确。也就是说,除非你知道最后一行永远不需要删除。但如果是这种情况,那么请对代码进行评论以明确说明。

    例如,如果有4行,则当前代码将j初始化为3,但由于--运算符的位置,循环内部看到:2,1,0 。对于显示的代码,使用var j = rows.length;或添加注释以显示逻辑是故意的。

  3. 2个if()语句根本不依赖于j! (至少代码是在这里发布的。)如果这是真的,那么将条件移到j循环之外。

  4. 考虑发布完整的未经编辑的代码。或者在Pastebin等网站上链接到它。



  5. 完整脚本的更新,现在它已链接到:

    扫描完整的代码,对于同一行,可以多次调用tables[i].deleteRow(j);

    无论如何应该做的简单解决方案是在每行删除后添加continue语句。

    要获得额外的功劳,请重新分析并简化旗帜和if逻辑。 :)



    目标网页的更新,现在它已链接到:

    检查目标页面时,此脚本循环的表包含嵌套表。

    在此行中抛出行数:
    var rows = tables[i].getElementsByTagName("tr");

    有时看起来像table [i]的行数比实际上直接拥有的行多。

    解决方案,使用内置的行数组;所以这条线变成了: var rows = tables[i].rows;

    ~~~~
    在检查相对于目标页面的脚本时,其他一些问题显而易见:

    1. 最好遍历所有表格。针对您需要的目标。所以这个:
      tables = document.getElementsByTagName("table");

      应改为:

      var tables = document.querySelectorAll ("div.KonaBody > table.roundy");
      

      ...它将只选择4个有效负载表,而不是它们的子表或散布的其他表。

    2. 通过微调初始表选择,不需要进行以下问号测试:

      if(tables[i].getAttribute("style").indexOf("border: 3px solid") != -1)
      
    3. var初始化前缺少majorSections

答案 1 :(得分:0)

如果j>&gt; =表中的行数,也会生成该错误,但我没有看到确切的问题。