使用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,因此它们是非负的.有人可以为我解释一下吗?
编辑:完整的代码可以在这里找到.
严格处理当前发布的代码,以下是我看到的问题:
发布的代码看起来不完整.在哪里rows初始化?这可能会导致声明的错误.
给定while(j--); 这var j = rows.length - 1;条线不正确.也就是说,除非您知道最后一行永远不需要删除.但如果是这种情况,那么请对代码进行评论以明确说明.
例如,如果有4行,则当前代码初始化j为3,但由于--运算符的位置,循环内部看到:2,1,0.对于如图所示的代码,使用var j = rows.length;或添加注释表明逻辑是故意的.
2个if()陈述完全不依赖j!(至少代码是在这里发布的.)如果这是真的,那么将条件移到j循环之外.
考虑发布完整的未经编辑的代码.或者在像Pastebin这样的网站上链接到它.
扫描完整的代码,看起来tables[i].deleteRow(j);可以多次为同一行调用.
无论如何应该做的简单解决方案是continue在每行删除后添加一个语句.
为了额外的功劳,重新分析并简化标志和if逻辑.:)
检查目标页面时,此脚本循环的表包含嵌套表.
这会抛出这一行中的行数:
var rows = tables[i].getElementsByTagName("tr");
有时让它看起来像table [i]有比它真正拥有的更多的行.
解决方案,使用内置的行数组; 所以这条线变成了:
var rows = tables[i].rows;
~~~~
在检查相对于目标页面的脚本时,其他一些问题似乎很明显:
循环遍历所有表格并不是最好的.针对您需要的目标.所以这:
tables = document.getElementsByTagName("table");
应改为:
var tables = document.querySelectorAll ("div.KonaBody > table.roundy");
Run Code Online (Sandbox Code Playgroud)
...它将只选择4个有效负载表,而不是它们的子表或散布的其他表.
通过微调初始表选择,不需要以下的problamatic测试:
if(tables[i].getAttribute("style").indexOf("border: 3px solid") != -1)
Run Code Online (Sandbox Code Playgroud)var在majorSections初始化之前缺少.