我有一个问题,即方法获得未定义的变量错误,即使我在调用之前检查变量是否未定义.
// 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未定义,这是r.focus行.该方法的所有调用者也在同一个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是我检查过的方法之一,似乎很好(没问题).不过我会再看一下这个:
它用于处理向下箭头并输入用于在输入元素表中导航的键.
根据您对问题的描述,在我看来,它有时会在没有完整性检查的情况下被调用.我将完整性检查放在函数内部而不是它之外.
但是,你也可能想知道你是如何绕过它的.我将修改函数如下,以检查Firebug中出现的问题:
idNav.prototype.setFocusFromVar = function(r) { if (!r) { return; // Set the breakpoint here } document.activeInputArea = r; r.focus(); r.select(); }
然后,当您点击断点时,您可以查看Firebug的堆栈跟踪,以确定如何在不检查r是否已定义的情况下获取该函数.