SetInterval POO - prob appel fonction membre

Résolu
ralecul Messages postés 111 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 1 août 2008 - 16 sept. 2006 à 00:48
ralecul Messages postés 111 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 1 août 2008 - 16 sept. 2006 à 10:22
Bonjour,

Je suis en train de réécrire mon système de panorama
(dispo ici)
en version POO. Mais la, je bute sur un problème avec SetInterval et l'appel à une méthode membre d'un objet. Je m'explique : je n'arrive pas à récupérer la valeur de this.decalage dans la méthode this.increase (alias TestClass_Increase). J'ai trouvé une solution proposée sur le forum mais elle utilise une variable globale qui empêche donc des éxécutions multiples au sein de la même page. Si vous appuyez sur les 2 bouttons start le deuxième arrête le premier... Donc j'aimerais savoir si il est possible de faire autrement ?



Merci d'avance

Henri




<html>
    <head>
        <meta http-equiv= "Content-Script-Type" content="text/javascript" />
        <title>Hello World 42</title>
    </head>
   
        <script type="text/javascript">       

    /* Test Class */
        function TestClass_init()
        {
            this.addDebug(' Init : decalage = '+this.decalage);
        }
       
        function TestClass_start()
        {  
            //solution trouvée sur le forum, proposé par bultez
            quoi = this;//mais ne permet pas des éxécutions multiples
            quoi.actif = setInterval(function(){quoi.increase();}, 200);
       
           
            //this.actif = setInterval(this.increase, 200); // ne trouve pas les variables menbres dans this.increase
            //this.actif = setInterval('this.increase()', 200); // ne marche pas
        }

        function TestClass_Stop()
        {
            this.addDebug(' Stop : decalage = '+this.decalage);
            clearInterval(this.actif);
        }
       
        functionTestClass_Increase()
        {
            this.decalage += 1;
            this.addDebug(' Increase : decalage = '+this.decalage);
        }
          
        function TestClass(debug)
        {
            this.decalage = 0;
            this.start    =TestClass_start;
            this.increase = TestClass_Increase;
            this.stop     = TestClass_Stop;      
            this.init     = TestClass_init;
            this.debug    = debug;
            this.addDebug = addDebug;
            this.clearDebug = clearDebug;
            this.init();
        }
       
    /* DEBUG */
        function addDebug(trace)
        {
            var debug = document.getElementById(this.debug);
            debug.innerHTML += trace+'
\n';
        }
       
        function clearDebug()
        {
            var debug = document.getElementById(this.debug);
            debug.innerHTML = "";
        }
        </script>
        <!-- zone de debug n°1 -->
       

           

           

           

           
           
           
       

       
        <!-- zone de debug n°2 -->
       

           

           

           

           
           
           
       

        <script type="text/javascript">
            var myTest1 = new TestClass('debug1');
            var myTest2 = new TestClass('debug2');
        </script>
   
</html>

2 réponses

cs_bultez Messages postés 13616 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
16 sept. 2006 à 07:56
une erreur de ma part ( faute d'inattention) !
il suffit de mettre une variable locale !
        var quoi = this;//mais ne permet pas des éxécutions multiples
<hr />
cordialement   Bul    mon Site    =Bul M'écrire<hr />
3
ralecul Messages postés 111 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 1 août 2008
16 sept. 2006 à 10:22
Merci beaucoup !

Effectivement ça marche beaucoup mieux avec une variable locale (pourquoi j'y ai pas pensé ?), je vais donc pouvoir continuer la migration de ma source en poo !

PS: pour ceux qui veulent tester ce petit bout de code, j'ai visiblement rajouté une erreur lors de la colorisation syntaxique : functionTestClass_Increase()  ->function TestClass_Increase() (il manque un espace entre function et TestClass_Increase).
0