2010-07-13 6 views
2

Ainsi, j'essaie de créer un objet javascript et d'utiliser la méthode setInterval.javascript setInterval ne fonctionne pas pour l'objet

Cela ne semble pas fonctionner. Si je supprime les guillemets, la méthode s'exécute une fois. Des idées pourquoi? En outre, j'utilise Jquery.

<script> 
$(function(){ 
    var kP = new Kompost(); 
    setInterval('kP.play()', kP.interval); 
}); 

var Kompost = function() 
{ 
    this.interval = 5000; 
    var kompost = this; 

    this.play = function() 
    { 
     alert("hello"); 
    } 
} 
</script> 
+0

Holy Crockford, il a utilisé eval! : O – Vincent

Répondre

7

appel comme ceci:

$(function(){ 
    var kP = new Kompost(); 
    setInterval(kP.play, kP.interval); 
}); 

Le problème est que kP est à l'intérieur de ce gestionnaire document.ready et pas disponibles dans le contexte mondial (il est seulement disponible à l'intérieur que la fermeture). Lorsque vous passez une chaîne à setInterval() ou setTimeout(), elle est exécutée dans un contexte global.

Si vous vérifiez votre console, vous verrez qu'il est erroné, en disant kP est indéfini, ce qui dans ce contexte, est correct. Dans l'ensemble, il devrait ressembler à ceci:

var Kompost = function() 
{ 
    this.interval = 5000; 
    var kompost = this; 
    this.play = function() { 
    alert("hello"); 
    }; 
}; 

$(function(){ 
    var kP = new Kompost(); 
    setInterval(kP.play, kP.interval); 
}); 

You can see it working here

+0

+1 pour la meilleure explication que ma (maintenant supprimé) réponse. – Yacoby

8

La solution fournie par @Yacoby et @ Nick, ne fonctionnera que si la méthode play ne pas utiliser la valeur this à l'intérieur lui-même, parce que la valeur this pointera vers l'objet global.

Pour gérer cela, vous devez une autre approche, par exemple:

$(function(){ 
var kP = new Kompost(); 
setInterval(function() { 
    kP.play(); 
}, kP.interval); 
}); 

Voir aussi:

+0

Je vois, merci l'homme. J'ai donné la solution à Nick seulement parce que cela a très bien fonctionné pour moi. Mais je comprends votre point de vue, et je pense définitivement que c'est une approche généralement supérieure. De plus, je ne savais pas que l'intervalle défini pouvait prendre une telle fonction. +1 –

0

Il fonctionne sur partout comme thymeleaf etc ...

function load() { 
    alert("Hello World!"); 
} 
setInterval(function() {load();}, 10000); 
Questions connexes