2010-12-09 29 views
5

Le système de menu est censé développer et réduire selon un délai donné en utilisant les énoncés suivants (o_item.getprop('hide_delay') retours 200 et o_item.getprop('expd_delay') retours 0):setTimeout dans Firefox

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

et

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

J'ai essayé de placer le code pour le premier argument dans des fonctions séparées et appelez ces fonctions comme le premier argument de setTimeout comme ceci:

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

Firebug a produit le message d'erreur suivant:

useless setTimeout call (missing quotes around argument?) 

Et il n'y avait pas de retard dans l'effondrement.

J'ai placé l'argument entre guillemets (mais recommandé contre here) comme ceci:

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

mais cela ne fonctionne pas. Il semblait que rien ne se passait et jeter des messages console.log() dans le code le confirmait.

J'ai essayé d'utiliser un appel de fonction anonyme comme recommandé here et here comme ceci:

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

mais cela ne fonctionne pas non plus. Il a produit des résultats indésirables dans IE (les éléments ne sont pas effondrés de la même manière qu'avant) et rien ne se passe dans Firefox (placer les instructions console.log() dans les fonctions expandItem et collapseItem a confirmé qu'elles n'étaient pas appelées).

J'ai même essayé de faire ce qui suit:

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

et cela ne même pas travailler! Il semble qu'il y ait quelque chose à faire avec l'appel de la fonction anonyme.

Découvert que l'affectation de la valeur de setTimeout à une variable autre que this.o_showtimer a fait l'argument de gauche de setTimeout feu. Doit être quelque chose à faire avec l'attribution de quelque chose à cela.

Si je fais ceci:

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

expandItem est appelé. Toutefois, si je le fais:

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

this.o_showtimer = o_showtimer; 

Comme si setTimeout pouvait prédire le futur! (expd_delay est 0!).

+1

Je soupçonne 'o_item.getprop ('hide_delay')' est pas entier, alors essayez ceci: 'cela.o_hidetimer = setTimeout (fonction() {alert ('test');}, parseInt (o_item.getprop ('hide_delay'), 10)); ' –

+1

On dirait que quelqu'un arrive plus tard et fait' clearTimeout (this.o_showtimer) '. –

+1

Le test rapide (http://jsfiddle.net/hkH9n/) montre que ce n'est pas un problème global avec les fonctions - s'il vous plaît nous montrer le code autour du 'this.o_showtimer =' et nous verrons. –

Répondre

5

Je pense que le problème est dans le traitement idiosyncratique de Javascript de 'ceci'. Lorsque vous appelez 'expandItem' dans votre fonction anonyme, vous ne l'appelez pas comme une méthode, donc 'ceci' est défini sur la portée fondamentale (fenêtre).

Je suggère d'utiliser une variable locale

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

J'ai essayé cela mais pas de joie. Je ne pensais pas que c'était le problème car, comme je l'ai dit, la fonction expandItem n'est pas appelée en premier lieu. Merci d'avoir essayé quand même. Appréciez-le. –