Javascript Firefox中的设置超时问题

Javascript Firefox中的设置超时问题,javascript,firefox,settimeout,Javascript,Firefox,Settimeout,菜单系统应该使用以下语句根据给定的延迟展开和折叠(o_项。getprop('hide_delay')返回200,而o_项。getprop('expd_delay')返回0): 及 我尝试将第一个参数的代码放入单独的函数中,并调用这些函数作为setTimeout的第一个参数,如下所示: this.o_showtimer = setTimeout( expandItem(this.n_id, n_id), o_item.getprop('expd_delay')); this.o_sh

菜单系统应该使用以下语句根据给定的延迟展开和折叠(
o_项。getprop('hide_delay')
返回200,而
o_项。getprop('expd_delay')
返回0):

我尝试将第一个参数的代码放入单独的函数中,并调用这些函数作为setTimeout的第一个参数,如下所示:

this.o_showtimer = setTimeout( expandItem(this.n_id, n_id),
      o_item.getprop('expd_delay'));
this.o_showtimer = setTimeout( "expandItem(this.n_id, n_id)",
  o_item.getprop('expd_delay'));
this.o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));
Firebug生成了以下错误消息:

useless setTimeout call (missing quotes around argument?)
崩塌没有拖延

我将该论点引用如下(尽管建议反对):

this.o_showtimer = setTimeout( expandItem(this.n_id, n_id),
      o_item.getprop('expd_delay'));
this.o_showtimer = setTimeout( "expandItem(this.n_id, n_id)",
  o_item.getprop('expd_delay'));
this.o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));
但这不起作用。似乎什么都没有发生,向代码中抛出一些console.log()消息证实了这一点

我尝试按照建议使用匿名函数调用,如下所示:

this.o_showtimer = setTimeout( expandItem(this.n_id, n_id),
      o_item.getprop('expd_delay'));
this.o_showtimer = setTimeout( "expandItem(this.n_id, n_id)",
  o_item.getprop('expd_delay'));
this.o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));
但这也不起作用。它在IE中产生了不理想的结果(项不折叠的方式与以前相同),在Firefox中没有发生任何事情(将console.log()语句放在expandItem和collapseItem函数中,确认没有调用它们)

我甚至试着做了以下几件事:

this.o_hidetimer = setTimeout( function() { alert('test'); },
  o_item.getprop('hide_delay'));
那根本不管用!似乎调用匿名函数有问题

发现将setTimeout的值赋给除this.o_showtimer以外的变量会激发setTimeout的左参数。一定是分配了一些东西给这个

如果我这样做:

var o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));
var o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));

 this.o_showtimer = o_showtimer;
expandItem被调用。但是,如果我这样做:

var o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));
var o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));

 this.o_showtimer = o_showtimer;

好像setTimeout可以预测未来!(expd_延迟为0!)。

我认为问题在于Javascript对“this”的特殊处理。当您在匿名函数中调用“expandItem”时,您并没有将其作为方法调用,因此“this”被设置为基本作用域(窗口)

我建议使用局部变量

var that = this;
this.o_showtimer = setTimeout( function() { expandItem(that.n_id, n_id); },
  o_item.getprop('expd_delay'));

试过了,但没有乐趣。我不认为这是问题所在,正如我所说,expandItem函数一开始就没有被调用。无论如何谢谢你的努力。我怀疑
o_item.getprop('hide_delay')
不是整数,所以试试这个:
this.o_hidetimer=setTimeout(function(){alert('test');},parseInt(o_item.getprop('hide_delay'),10))
听起来好像有人稍后会出现并执行
clearTimeout(this.o_showtimer)
。快速测试()表明这不是函数的全局问题-请向我们展示有关
this.o_showtimer=
的代码,我们拭目以待。感谢大家的帮助@杰森,你的评论让我进一步调查,通过使用firebug,我发现了问题所在。由于处理事件的函数重置了计时器,因此大量的鼠标事件一定覆盖了我想要的事件。我设法把注意力集中在这个问题上,并修改了一行代码(太多了,这里无法详述)。我现在不太清楚它为什么要做它正在做的事情,但是改变那条线解决了我的问题。基本上,我必须“新”菜单,而不是仅仅把它称为一个函数。感谢你们的评论。我投票支持他们,因为他们帮助了我:)