Firefox中的setTimeout问题

时间:2010-12-09 12:18:52

标签: javascript firefox settimeout

菜单系统应该根据给定的延迟使用以下语句进行扩展和折叠(o_item.getprop('hide_delay')返回200并且o_item.getprop('expd_delay')返回0):

this.o_showtimer = setTimeout('A_MENUS['+ this.n_id +'].expand(' + n_id + ');',
  o_item.getprop('expd_delay'));

this.o_hidetimer = setTimeout('A_MENUS['+ this.n_id +'].collapse();',
  o_item.getprop('hide_delay'));

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

this.o_showtimer = setTimeout( expandItem(this.n_id, n_id),
      o_item.getprop('expd_delay'));

Firebug产生了以下错误消息:

useless setTimeout call (missing quotes around argument?)

崩溃没有延迟。

我把参数放在引号中(尽管建议不要here),如下所示:

this.o_showtimer = setTimeout( "expandItem(this.n_id, n_id)",
  o_item.getprop('expd_delay'));

但这不起作用。似乎没有任何事情发生,并且在代码中抛出一些console.log()消息证实了这一点。

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

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

但这也不起作用。它在IE中产生了不良结果(没有折叠的项目与以前一样)并且在Firefox中没有发生任何事情(在expandItem和collapseItem函数中放置console.log()语句确认它们没有被调用)。

我甚至尝试过以下操作:

this.o_hidetimer = setTimeout( function() { alert('test'); },
  o_item.getprop('hide_delay'));

那甚至都没有用!似乎有一些事情要求调用匿名函数。

发现将setTimeout的值分配给变量 other 而不是this.o_showtimer使得setTimeout的左参数为fire。必须与为此分配内容有关。

如果我这样做:

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

expandItem被调用。但是,如果我这样做:

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

 this.o_showtimer = o_showtimer;

好像setTimeout可以预测未来! (expd_delay是0!)。

1 个答案:

答案 0 :(得分:5)

我认为问题在于Javascript对'this'的特殊处理。当您在匿名函数中调用'expandItem'时,您不会将其称为方法,因此'this'将设置为基本范围(窗口)。

我建议使用局部变量

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