Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# [Résolu] probleme avec setInterval

Envoyé par : mat

Date : 23/08/2006 11:58

Bonjour,

je veux faire tourner un chronometre (d'ailleurs, si cela existe en xpcom, ou tout fait, je prends, parce que je n'ai pas trouvé...), et je suis donc appelé a utiliser la fonction JS setInterval.. et c'est là que le bât blesse: que j'utilise

this.intervalchrono = setInterval("update();",2000);

ou alors

this.intervalchrono = setInterval("function(){update();}",2000);

le résultat est le meme: update() ne se lance pas, et un try...catch ne retourne pas d'erreur!

Si quelqu'un a une suggestion, je suis preneur

Pour info, mes fonctions se présentent ainsi:

function chrono()
{
	function update()
	{
		alert('youpi!');
	}
	this.depart = new Date();
	alert('init');
	this.intervalchrono = setInterval("function(){update();}",2000); } //la fonction est relancée tous les 2 secondes
}

# Re: probleme avec setInterval

Envoyé par : papy

Date : 23/08/2006 12:18

Le problème viens certainement du fait que la fonction update est définie à l'intérieur de la fonction chrono et n'a donc pas de portée globale. Pour rappel, ce qui est passé à setInterval ou setTimeout est

  • soit une fonction
  • soit une chaîne javascript à évaluer

Dans les deux cas, l'évaluation va se faire à partir de l'objet window (this fait référence à window). Si tu passe une fonction l'évaluation se fera correctement car on a directement la référence sur cette fonction donc pas de problème de contexte (à part le this). Si tu passe du code il faut qu'il puisse être évalué au niveau de l'objet window (contexte global).

Tu a donc deux possibilités pour corriger ton code :

  • soit tu définis la fonction update en dehors de chrono et donc la ca devrait marcher
  • soit tu passes directement la fonction en paramètre et non une chaîne à évaluer (sans doute mieux) :
this.intervalchrono = setInterval(update, 2000);

J'espère que je n'ai pas été trop confus ;) Le lien de la référence à setInterval au cas ou : http://developer.mozilla.org/en/docs/DOM(..)

Une petite astuce aussi, tu peux passer un (ou plusieurs ?) paramètre en plus après l'interval, il sera passé en paramètre à la fonction ou au code apellé, pratique pour solutionner le problème du this :

var monobjet = {
    nom: 'mon objet',

    test: function(me) {
        //alert(this.nom) ne marchera pas car this = window
        //en revanche me fait référence a l'objet, cf l'appel a setInterval
        alert(me.nom);
    },

    start: function() {
        //on passe this en paramètre pout la méthode test
        setInterval(this.test, 2000, this);
    }
};

# Re: probleme avec setInterval

Envoyé par : mat

Date : 23/08/2006 14:10

Merci Papy,

J'ai suivi la methode la plus simple: this.intervalchrono = setInterval(update, 2000);

merci également pour la référence qui est une approche peut etre plus adaptée a ce que je fais que selfhtml...

# Re: probleme avec setInterval

Envoyé par : papy

Date : 23/08/2006 14:21

De rien, j'ai lutté un petit moment sur les setInterval et setTimeout mais à cause du this ;) Sinon pour selfhtml, c'est assez bien comme référence, mais c'est vrai que tout n'y figure pas forcément...

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.