the*_*_mr 5 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'));
Run Code Online (Sandbox Code Playgroud)
和
this.o_hidetimer = setTimeout('A_MENUS['+ this.n_id +'].collapse();',
o_item.getprop('hide_delay'));
Run Code Online (Sandbox Code Playgroud)
我尝试将第一个参数的代码放入单独的函数中,并将这些函数作为setTimeout的第一个参数调用,如下所示:
this.o_showtimer = setTimeout( expandItem(this.n_id, n_id),
o_item.getprop('expd_delay'));
Run Code Online (Sandbox Code Playgroud)
Firebug产生以下错误消息:
useless setTimeout call (missing quotes around argument?)
Run Code Online (Sandbox Code Playgroud)
崩溃没有延迟.
我把参数放在引号中(尽管这里推荐),像这样:
this.o_showtimer = setTimeout( "expandItem(this.n_id, n_id)",
o_item.getprop('expd_delay'));
Run Code Online (Sandbox Code Playgroud)
但这没用.似乎没有任何事情发生,并且在代码中抛出一些console.log()消息证实了这一点.
this.o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
o_item.getprop('expd_delay'));
Run Code Online (Sandbox Code Playgroud)
但这也行不通.它在IE中产生了不良结果(没有折叠的项目与以前一样)并且在Firefox中没有发生任何事情(在expandItem和collapseItem函数中放置console.log()语句确认它们没有被调用).
我甚至试过做以下事情:
this.o_hidetimer = setTimeout( function() { alert('test'); },
o_item.getprop('hide_delay'));
Run Code Online (Sandbox Code Playgroud)
那甚至都没有用!似乎有一些调用匿名函数的东西.
发现的setTimeout的值赋值给一个变量其他比this.o_showtimer制成的setTimeout火的左参数.必须与为此分配内容有关.
如果我这样做:
var o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
o_item.getprop('expd_delay'));
Run Code Online (Sandbox Code Playgroud)
expandItem被调用.但是,如果我这样做:
var o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
o_item.getprop('expd_delay'));
this.o_showtimer = o_showtimer;
Run Code Online (Sandbox Code Playgroud)
好像setTimeout可以预测未来!(expd_delay是0!).
我认为问题在于Javascript对'this'的特殊处理.当您在匿名函数中调用'expandItem'时,您不会将其称为方法,因此'this'将设置为基本范围(窗口).
我建议使用局部变量
var that = this;
this.o_showtimer = setTimeout( function() { expandItem(that.n_id, n_id); },
o_item.getprop('expd_delay'));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6284 次 |
最近记录: |