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

Kon*_*gMD 3 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)
Run Code Online (Sandbox Code Playgroud)

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

编辑:完整的代码可以在这里找到.

Bro*_*ams 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这样的网站上链接到它.



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

扫描完整的代码,看起来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");
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 通过微调初始表选择,不需要以下的problamatic测试:

    if(tables[i].getAttribute("style").indexOf("border: 3px solid") != -1)
    
    Run Code Online (Sandbox Code Playgroud)
  3. varmajorSections初始化之前缺少.