Javascript 发生了什么事?前一天还可以,第二天就';未定义';?

Javascript 发生了什么事?前一天还可以,第二天就';未定义';?,javascript,greasemonkey,undefined,firefox4,Javascript,Greasemonkey,Undefined,Firefox4,我在写一个油腻的剧本。最近我有两次同样的问题,我不知道为什么会发生这种情况 function colli(){ ..... var oPriorityMass = bynID('massadderPriority');//my own document.getElementById() function var aPriorities = []; if (oPriorityMass) { for (var cEntry=0; cEntry < oPriorityMass.child

我在写一个油腻的剧本。最近我有两次同样的问题,我不知道为什么会发生这种情况

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));
    }
}
.....
}
ns函数只是在ID前面添加脚本名。我在创建HTML元素时使用它,这样我的元素就不会与网页具有相同的ID。所以bynID()是一个简单的函数,当我需要按ID获取元素时,它可以节省一些键入时间

我已经修改了我的
colli()
函数以包含check

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));
    }
}
if(oPriorityMass){
如果(!oPriorityMass.childNodes[0]){
GM_日志(“重试”);
setTimeout(loadPage,2000);
返回;
}
对于(var cEntry=0;cEntry

loadPage
函数执行一个AJAX调用,然后我对它运行一些XPATH查询,但实际内容从未附加/显示在页面上,只是保存在
document.createElement('div')
中,然后该函数调用
colli()
。现在,当我修改了我的函数时,我检查了错误控制台,发现它可能需要5次尝试才能正常工作。5 x 2秒,也就是10秒。永远不会有5次重试,可能会有所不同,一定会有其他事情发生?

在Firefox中,childNodes可以包括#文本节点。在尝试调用之前,应检查以确保
childNodes[cEntry]
具有
nodeType==1
或具有
getAttribute
方法。e、 g

<div id="d0">
</div>
<div id="d1"></div>


那个么,根据你们上一次的编辑,它现在可以正常工作了,但会有延迟,对吗

但是,当我建议延迟时,它并不打算在等待时执行(甚至更多?)ajax调用

不是

if (!oPriorityMass.childNodes[0]) {
    GM_log('Retrying');
    setTimeout(loadPage,2000);
    return;
更像:

setTimeout (colli, 2000);
因此,ajax和
loadPage
所做的其他事情可以解释过度延迟的原因


随机行为可能由以下原因引起:

return top.document.getElementById(ns(sID));
如果存在任何帧或iframe,并且您不阻止对帧的操作,这将导致不稳定的行为。(如果您确实阻止了此类操作,则
top
是多余和不必要的。)
在这种情况下,GM不能正确运行——这取决于脚本的功能——通常看起来好像是从顶部作用域“切换”到框架作用域,反之亦然

因此,最好将其改为:

return document.getElementById (ns (sID) );

并确保您有:

if (window.top != window.self)  //-- Don't run on frames or iframes
    return;
作为代码的顶部行


除此之外,由于信息不足,几乎不可能看到问题

要么将问题煮沸成一个完整的,独立的配方,以复制故障


或者,发布或链接到完整的未编辑的脚本,是
节点。childNodes[c]
未定义,还是
节点。childNodes[c]。getAttribute('coll')
(等)未定义。。。页面是否被任何JavaScript修改。。。我们需要一个具体的失败秘诀或者一个完整脚本代码的链接来对此提供更多帮助。我已经编辑了我的帖子,希望它现在能提供更多信息。try-catch块返回的错误与没有try-catch块的错误完全相同。异常是在第一次命中该行时抛出的,还是在多次循环后抛出的?孩子们是否可能没有从0开始按顺序编号?@Basiclife第一次。即使我将for循环更改为
for(oPriorityMass.childNodes中的var cEntry)
,也会引发错误。在这种情况下,从理论上讲,cEntry必须工作,但它在第一次运行时出错,在第二次运行时工作。这听起来像是修改页面的竞争条件,或者是
bynID()
中的错误。(没有完整的细节很难确定。)将代码发布到
bynID()
,并尝试在短延迟(500到2000毫秒)后调用
colli()
函数。我无法发布脚本。我相信你在操纵页面内容方面是正确的。延迟并不总是有效的。这个问题的解决方案是直接列出我需要的元素,而不做类似
element.childNode[x]
的事情。我向需要的元素添加了类,然后通过自定义
document.getElementsByClass将这些元素放入数组,效果很好。
setTimeout (colli, 2000);
return top.document.getElementById(ns(sID));
return document.getElementById (ns (sID) );
if (window.top != window.self)  //-- Don't run on frames or iframes
    return;