2010-12-09 21 views
5

Se supone que el sistema de menús para expandir y contraer de acuerdo con un retardo determinado, utilizando las siguientes declaraciones (o_item.getprop('hide_delay') retornos 200 y o_item.getprop('expd_delay') devuelve 0):setTimeout en Firefox

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

y

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

Traté de colocar el código para el primer argumento en funciones separadas y llamo a estas funciones como el primer argumento para setTimeout como este:

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

Firebug produce el siguiente mensaje de error:

useless setTimeout call (missing quotes around argument?) 

Y no hubo retraso en el colapso.

coloqué el argumento entre comillas (aunque se recomienda contra here) así:

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

pero esto no funcionó. Parecía que nada estaba sucediendo en absoluto y arrojar algunos mensajes console.log() en el código confirmó esto.

He intentado utilizar una llamada de función anónima como se recomienda here y here así:

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

pero esto tampoco funcionó. Produjo resultados indeseables en IE (los elementos que no se colapsan son de la misma manera que antes) y no ocurre nada en Firefox (al colocar las instrucciones console.log() en las funciones expandItem y collapseItem confirmaron que no estaban siendo llamadas).

Incluso he intentado hacer lo siguiente:

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

y que ni siquiera funcionaba! Parece que hay algo con llamar a la función anónima.

Descubierto que asignando el valor de setTimeout a una variable otra que this.o_showtimer se activa el argumento de la izquierda de setTimeout. Debe ser algo relacionado con asignar algo a esto.

Si hago esto:

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

expandItem es llamado. Sin embargo, si hago esto:

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

this.o_showtimer = o_showtimer; 

Como si setTimeout pudiera predecir el futuro! (expd_delay es 0!).

+1

Sospecho 'o_item.getprop ('hide_delay')' no es entero, así que pruebe esto: 'esto.o_hidetimer = setTimeout (function() {alert ('test');}, parseInt (o_item.getprop ('hide_delay'), 10)); ' –

+1

Parece que alguien más tarde vendrá y hará' clearTimeout (this.o_showtimer) '. –

+1

La prueba rápida (http://jsfiddle.net/hkH9n/) muestra que no es un problema global con las funciones; muéstranos el código alrededor de 'this.o_showtimer =' y ya veremos. –

Respuesta

5

Creo que el problema está en el tratamiento idiosincrásico de Javascript de 'esto'. Cuando llama a 'expandItem' dentro de su función anónima, no lo está llamando como un método, por lo que 'esto' se establece en el alcance (ventana) fundamental.

se recomienda usar una variable local

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

Intenté eso pero no alegría. No pensé que ese era el problema ya que, como dije, la función expandItem no se está llamando en primer lugar. Gracias por intentarlo de todos modos. Lo aprecio. –