菜单系统应该根据给定的延迟使用以下语句进行扩展和折叠(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()消息证实了这一点。
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!)。
答案 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'));