使用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。
答案 0 :(得分:5)
严格处理当前发布的代码,以下是我看到的问题:
发布的代码看起来不完整。 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");
...它将只选择4个有效负载表,而不是它们的子表或散布的其他表。
通过微调初始表选择,不需要进行以下问号测试:
if(tables[i].getAttribute("style").indexOf("border: 3px solid") != -1)
var
初始化前缺少majorSections
。答案 1 :(得分:0)
如果j>&gt; =表中的行数,也会生成该错误,但我没有看到确切的问题。