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,我发现了问题所在。由于处理事件的函数重置了计时器,因此大量的鼠标事件一定覆盖了我想要的事件。我设法把注意力集中在这个问题上,并修改了一行代码(太多了,这里无法详述)。我现在不太清楚它为什么要做它正在做的事情,但是改变那条线解决了我的问题。基本上,我必须“新”菜单,而不是仅仅把它称为一个函数。感谢你们的评论。我投票支持他们,因为他们帮助了我:)