我正在写一个greasemonkey脚本。最近我两次遇到同样的问题,我不知道为什么会这样。
function colli(){
.....
var oPriorityMass = bynID('massadderPriority');//my own document.getElementById() function
var aPriorities = [];
if (oPriorityMass) {
for (var cEntry=0; cEntry < oPriorityMass.childNodes.length; cEntry++) {
var sCollNumber = oPriorityMass.childNodes[cEntry].getAttribute('coll');
if (bynID('adder' + sCollNumber + '_check').checked)
aPriorities.push(parseInt(sCollNumber));
}
}
.....
}
所以这其中的奥秘在于,有一天我oPriorityMass
命名为oPririoty
. 它工作正常,但整个功能尚未完成,我开始为我的脚本开发另一个功能。这些功能之间没有任何联系。
几天后,我决定回到上面示例中的函数并完成它。我在没有修改任何内容的情况下对其进行了测试,并在 firefox 的 (4) javascript 错误控制台中出现了错误提示oPriority.chilNodes[cEntry] is undefined
。注意,几天前我以完全相同的方式对其进行了测试,根本没有这样的问题。
好的,所以,我决定重命名oPriority
为oPriorityMass
. 神奇的是,问题解决了。
起初我想,也许有 2 个对象有一些冲突,在不同的函数中使用了相同的名称,即使在函数范围之外,它们也以某种方式继续存在。我的脚本目前超过 6000 行,但我进行了搜索,发现oPriority
除了这个确切的函数之外没有提到其他任何地方。
有人可以告诉我,这是如何发生的以及为什么会发生这种情况?我提到同样的事情现在发生了两次,它们发生在不同的功能中,但同样的问题node.childNodes[c] is undefined
不是node
null 并且node.childNodes.length
显示正确的子数。到底是怎么回事?我该如何避免此类问题?
谢谢
编辑:错误控制台给出的错误是
Error: uncaught exception: TypeError: oPriorityMass.childNodes[cEntry] is undefined
作为对 Brocks 评论的回应:
作为消息GM_log(oPriorityMass.childNodes[cEntry])
返回。通常未定义的事物也是undefined
如此。node.childNodes[c]
我的脚本创建了一个 div 窗口。后来上面的函数用到了这个div里面的元素。元素确实有唯一的 ID,我 100% 确定原始站点不知道它们。我的脚本有一个开始/停止按钮,可以在需要时运行一个或另一个功能。我现在一直在刷新页面并运行我的脚本功能。我注意到有时(但并非总是)脚本在第一次运行时会因描述的错误而失败,但是,如果我再次运行它(不刷新页面),它就会开始工作。
该页面有一个修改它的javascript。它改变了它的一些元素宽度,所以当浏览器调整大小时它会改变。但我知道它对我的 div 没有影响,因为当我调整浏览器大小时它保持不变。
编辑2:
function bynID(sID) {
return top.document.getElementById(ns(sID));
}
function ns(sText) {
return g_sScriptName + '_' + sText;
}
ns 函数只是在 ID 前面添加脚本名称。我在创建 HTML 元素时使用它,因此我的元素永远不会与网页具有相同的 id。所以 bynID() 是一个简单的函数,当我需要按 ID 获取元素时,它可以节省一些打字时间。
我已经修改了我的colli()
功能以包括检查
if (oPriorityMass) {
if (!oPriorityMass.childNodes[0]) {
GM_log('Retrying');
setTimeout(loadPage,2000);
return;
}
for (var cEntry=0; cEntry < oPriorityMass.childNodes.length; cEntry++) {
var sCollNumber = oPriorityMass.childNodes[cEntry].getAttribute('coll');
if (bynID('adder' + sCollNumber + '_check').checked)
aPriorities.push(parseInt(sCollNumber));
}
}
该loadPage
函数执行 1 个 AJAX 调用,然后我对其运行了几个 XPATH 查询,但实际内容从未附加/显示在页面上,只是保留在内部document.createElement('div')
,然后此函数调用colli()
。所以现在,当我修改了我的函数时,我检查了错误控制台,发现它可能需要 5 次尝试才能开始正常工作。5 x 2 秒,也就是 10 秒。永远不会总是重试 5 次,可能会有所不同 一定是发生了其他事情吗?