2010-05-11 4 views
0

J'essaie de créer un plugin jQuery qui exécute une méthode sur un timer. Je voudrais travailler sur plusieurs éléments sur une page indépendamment. J'ai atteint un point où le timer s'exécute pour chaque élément, mais la méthode appelée dans setTimeout semble ne connaître que la dernière instance du plugin.Problème de portée Javascript avec object et setTimeout

Je sais que je suis en train de faire quelque chose de fondamentalement stupide ici, mais je suis ébranlé si je sais quoi. Je sais que des choses comme celle-ci ont été posées 8 millions de fois auparavant, mais je n'ai pas réussi à trouver une réponse à mon problème spécifique.

Voici un script qui illustre la structure de ce que je fais.

<html> 
<head> 
<script type="text/javascript" src="assets/jquery.min.js"></script> 
<script type="text/javascript"> 
var crap = 0; 
(function($) 
{ 
    jQuery.fn.pants = function(options) { 
     var trousers = { 
      id: null, 
      current: 0, 
      waitTimeMs: 1000, 

      begin: function() { 
       var d = new Date(); 
       this.id = crap++; 
       console.log(this.id); 
       // do a bunch of stuff 
       window.setTimeout(function(self) {return function() {self.next();}}(this), this.waitTimeMs); 
      }, 

      next: function() { 
       this.current ++; 
       console.log(this.id); 
       window.setTimeout(function(self) {return function() {self.next();}}(this), this.waitTimeMs); 
      }, 
     }; 

     options = options || {}; 
     $.extend(trousers, options); 

     this.each(function(index, element) { 
      trousers.begin(); 
     }); 

     return this; 
    }; 
} 
)(jQuery); 
jQuery(document).ready(function() { 
    jQuery("div.wahey").pants(); 
}); 
</script> 
</head> 
<body> 
<div class="wahey"></div> 
<div class="wahey"></div> 
</body> 
</html> 

La sortie que je reçois est la suivante:

0 
1 
1 
1 
1 
1 

La sortie je pense obtenir est ceci:

0 
1 
0 
1 
0 
1 

Répondre

0

Il se pourrait que vous utilisez « ce » qui est navigateur spécifique et ne pas toujours point to what you want it to point to. Cela appartient au propriétaire de la fonction, pas à l'objet de la fonction.

+0

Que puis-je faire pour le réparer? – Shabbyrobe

+0

utilise des variables spécifiques à la portée au lieu de cela. Regardez http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/ près du bas où il est question de "The infamous loop problem" – Malfist