我遇到一个方法是获取未定义的变量错误的问题,即使我在调用之前检查变量是否未定义。
// Sets focus and text-select to the passed in element.
idNav.prototype.setFocusFromVar = function(r) {
document.activeInputArea = r; // my variable for tracking focus
r.focus(); // error happens here (line 274 of idNav.js)
r.select();
}
错误发生在r.focus行。
在我调用该方法的两个地方,我使用类似于以下的模式,在调用者中使用局部变量r。
if (!r)
return;
this.setFocusFromVar(r);
然而错误仍然存在。当r不为null或未定义时,它是我网页上表格中的输入元素。
我继续在idNav.js的第274行(即r.focus行)上未定义r。该方法的所有调用者也在同一个js文件中。
我错过了什么?
这个错误在Firefox中间歇性地发生,我没有在IE中测试过这个特定的错误。
EDTA: r确实显示为未定义,错误的堆栈跟踪显示:
setFocusFromVar()(undefined)IDNav.js (line 275)
dhandler(Object originalEvent=Event keydown type=keydown)IDNav.js (line 100)
newTrigger()(Object originalEvent=Event keydown type=keydown)jquery.hotkeys.js (line 1)
F()()jquery.js (line 19)
F()(Object originalEvent=Event keydown type=keydown)jquery.js (line 19)
F()()jquery.js (line 19)
[Break on this error] r.focus();
dhandler是我检查过的方法之一,似乎很好(没有问题)。 不过我会再次看一下:
它用于处理向下箭头并输入用于在输入元素表中导航的键。
答案 0 :(得分:5)
根据您对问题的描述,在我看来,有时在没有完整性检查的情况下调用它。我将完整性检查放在函数内部而不是在函数之外。
但是,您可能也想知道如何首先解决这个问题。我将按如下方式修改函数以检查Firebug中出现的问题:
idNav.prototype.setFocusFromVar = function(r) {
if (!r) {
return; // Set the breakpoint here
}
document.activeInputArea = r;
r.focus();
r.select();
}
然后当您点击断点时,您可以查看Firebug的堆栈跟踪,以确定如何在不检查r是否已定义的情况下获取该函数。
答案 1 :(得分:2)
我建议在功能中移动(或复制)您的健全检查,如下所示:
idNav.prototype.setFocusFromVar = function(r) {
if (!r)
return;
document.activeInputArea = r; // my variable for tracking focus
r.focus(); // error happens here (line 274 of idNav.js)
r.select();
}
答案 2 :(得分:0)
我不确定,但不应该调用if(r == undefined)而不是if(!r)? 我总是这样做......
答案 3 :(得分:0)
您应该测试该变量不为空并且不等于undefined
。
这是关于Javascript中存在的测试变量的good article。它列出了各种方法,以及每种方法的优缺点。
答案 4 :(得分:0)
我很少使用if(!r)来测试变量是否未定义。
我更喜欢使用if(typeof(r)=='undefined')或if(r!= null)。
r的值取决于其声明和影响。