Partage
  • Partager sur Facebook
  • Partager sur Twitter

[jquery] Probleme de ciblage avec 'this'

Class

Sujet résolu
    19 novembre 2011 à 18:21:00

    Bonjour à tous,

    Me voila dans un problème assez saugrenu! :p

    Je travail sur une class javascript, et lorsque dans cette class j'appel des fonctions jquery, je n'arrive plus a appeler l'instance dans laquelle elel se situe. le 'this' definit l'element et plus la class.


    exemple
    var moninstance = maclass.mafonction();
    
    var maclass={
    
     mavariable:$('#madiv'),
     mafonction:function(){
    
       this.mavariable.click(function(){
         this.reussir();//ça ne peux pas marcher puisque 'this' appel "maviariable"
       });
    
     },
     reussir:function(){
       alert("j'ai reussi");
     }
    
    }
    


    Existe t'il une solution pour appeler, dans mon exemple , la fonction "réussir".

    PS: ma classe est beaucoup plus complexe mais le pb est le même

    Merci beaucoup
    • Partager sur Facebook
    • Partager sur Twitter
      19 novembre 2011 à 18:30:55

      Tu fais une variable juste avant : var that = this;

      Et tu utilises that.
      • Partager sur Facebook
      • Partager sur Twitter
        19 novembre 2011 à 18:49:59

        c'est malin... mais du coup la function ne fait pas appel à l'instance mais a toutes les instances de cette classe.
        Dans le cas ou je déclare plusieurs instance, et que par exemple 'mavariable' cible un element précis:

        var moninstance1 = maclass.mafonction('#div1');
        var moninstance2 = maclass.mafonction('#div2');
        
        var maclass={
        
         mavariable:'',
         desolation:this,
         mafonction:function(selecteur){
        
           this.mavariable=selecteur;
           this.mavariable.click(function(){
             desolation.reussir();//ça ne peux pas marcher puisque 'this' appel "maviariable"
           });
        
         },
         reussir:function(){
           console.log(this.mavariable);
         }
        
        }
        


        console.log me renvoi le dernier #div2 dans les deux cas.
        • Partager sur Facebook
        • Partager sur Twitter
          19 novembre 2011 à 18:57:59

          Tu n'utilises pas l'astuce au bon endroit :

          mafonction:function(){
             var that = this; // Ici !
             this.mavariable.click(function(){
               that.reussir(); // that référence l'ancien this
             });
          
           },
          


          EDIT : Euh, par contre, le problème que tu décris à la fin de ton dernier post n'en est pas un...

          Tu n'as pas créé une classe, mais un singleton... Et tu ne l'instancies jamais. Il est donc normal qu'il n'y ait pas d'instances.
          • Partager sur Facebook
          • Partager sur Twitter
            19 novembre 2011 à 19:05:40

            Pour appeler reussir, tu as juste à faire maclass.reussir(). Ta "class" est juste un objet contenant des variables et des fonctions.

            On n'utilise pas this pour faire référence à une class de toute façon. Quand une class met à disposition des fonctions et des variables statiques, on les appelle en nommant la class (genre Math.round() ou Math.PI)

            Et quand elle crée des instances d'elle-même (pour commencer on passe par une fonction constructeur en plaçant le mot-clé new devant) l'intérêt de this c'est justement de cibler l'instance et pas la class.
            • Partager sur Facebook
            • Partager sur Twitter
              19 novembre 2011 à 19:28:22

              Impec! Merci a vous trois!

              En effet Geoffrey, il faut que je passe par une classe instanciable :s (je débute en js orienté objet);

              Avec ton code, il me restait a faire ça:

              function maclass(div){
              
               this.madiv=div;
              
               mafonction:function(){
                 var that = this; 
              
                 this.mavariable.click(function(){
                   console.log(that.madiv); 
                 });
              
                }
              
              }
              
              //puis 
              var monInstance1=new mafonction('#div1');
              var monInstance2=new mafonction('#div2');
              monInstance.mafonction();
              


              et la console m'affiche bien:
              [#div1]
              [#div2]

              Merci beaucoup

              • Partager sur Facebook
              • Partager sur Twitter
                19 novembre 2011 à 19:34:04

                Je suppose que ton code réel diffère de celui-ci qui est syntaxiquement incorrect.

                Mais content que ton sujet soit résolu. Bonne continuation ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  19 novembre 2011 à 20:23:51

                  Je ne comprends pas pourquoi tu fais tout ce schmilblick

                  function Maclass(div){
                    this.madiv=document.getElementById(div);
                    this.madiv.onclick=function(){
                      alert(this); 
                    }
                  }
                  var monInstance=new Maclass('div1');
                  

                  (bon, tu te le rebidouilleras en jQuery)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 novembre 2011 à 10:13:48

                    ça marche bien mais ça rame pas mal sur ipad.

                    voila pourquoi j'ai voulu faire ça:

                    http://www.televisionconnectee.fr

                    login:gobelins
                    mdp:!cdnl!

                    (j'ai eu besoin de votre aide pour les petits tas de photos interactifs vers le bas de la frise, cliquez dessus)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 novembre 2011 à 11:49:11

                      C'est normal que ça rame. Tu utilises la propriété transform, il y a un filtre anti-crénelage et c'est animé (certainement avec un timer)... des procédés qui sont connus pour être lourds ou inconstants sur tablette et mobiles.

                      Par contre, même sur un PC puissant, ton animation n'est pas très belle : ça tremblotte un peu.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 novembre 2011 à 13:55:15

                        Oui bien c'est vrai que ça rame trop! j'utilise "animate" de jquery pour l'animation et la rotation. connais-tu une alternative?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 novembre 2011 à 14:13:40

                          CSS3 (mais ça t'oblige à faire un fallback en Javascript pour les vieux navigateurs).

                          Je ne sais pas si jQuery a intégré requestAnimationFrame ou s'il utilise toujours setTimeout pour les animations, mais requestAnimationFrame est plus constant sur mobile.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 novembre 2011 à 18:29:18

                            Citation : .animate() - jQuery API


                            Because of the nature of requestAnimationFrame(), you should never queue animations using a setInterval or setTimeout loop. In order to preserve CPU resources, browsers that support requestAnimationFrame will not update animations when the window/tab is not displayed. If you continue to queue animations via setInterval or setTimeout while animation is paused, all of the queued animations will begin playing when the window/tab regains focus. To avoid this potential problem, use the callback of your last animation in the loop, or append a function to the elements .queue() to set the timeout to start the next animation.



                            Donc je suppose qu'ils l'utilisent.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            [jquery] Probleme de ciblage avec 'this'

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown