2010-03-23 10 views
2

Disons que je fais:Javascript - Jquery .load() et setInterval() question

$("#content").load(...); 

Dans ce que je suis chargement javascript est inclus:

var myCounter = 0; 
var myInterval = setInterval(function(){ 
    myCounter++; 

    $("#counter-display").html("Count: "+myCounter); 
}); 

Pour une raison inconnue , si je recharge le contenu avec $ ("# content"). load (...); - myInterval est maintenant appelé deux fois.

J'ai essayé de faire quelque chose comme:

if (myInterval !== undefined){ 
    //dont set interval again 
} 

Cependant, cela ne fonctionne pas. Est-ce que quelqu'un connaît une méthode quelconque pour que myInterval soit effacé sur .load, sans avoir besoin de mettre le javascript en dehors du fichier chargé?

Répondre

2

Essayez de garder l'intervalle et compter dans l'objet de données sur l'élément de contre, comme ceci:

var disp = $("#counter-display"); 
if(!disp.data("interval")) { 
    disp.data("interval", setInterval(function() { 
    var count = (disp.data("count") || 0) + 1; 
    disp.data("count", count).html("Count: " + count); 
    }, 500)); 
} 

Un peu plus de code une fois, mais beaucoup plus propre pour les variables globales, etc.

+0

J'ai pensé faire cela au début, mais je voulais essayer une méthode sans avoir besoin de récupérer la valeur du code HTML à chaque fois. Cependant, cela fonctionne mieux alors je vais l'utiliser. Merci! – Joe

+0

Après d'autres tests, bien que cette méthode mots pour mettre à jour le compte affiché, lorsque vous essayez d'utiliser ce compte dans le script, il se dédouble encore. Je n'ai pas trouvé de solution, sinon mettre mon script en dehors du contenu chargé (par exemple sur la page où je fais le .load()). – Joe

+0

@Joe: Vous êtes probablement en train de recréer l'élément '@ counter-display'. Placez les données dans un élément qui n'est pas remplacé. – SLaks

0

Votre code est en cours d'exécution deux fois.

Essayez de vérifier if (typeof myInterval !== "undefined") avant de déclarer la variable.

+0

Testé - ne fonctionne pas. Il semble que chaque "myInterval" soit traité séparément dans le DOM. – Joe

+0

Votre code est-il dans une fonction? – SLaks

+0

Oui. De toute façon, la solution de Nick Craver fonctionne bien. – Joe

0

Vous » ll trouvera probablement que myInterval est en cours de définition dans une portée locale.

Essayez d'utiliser:

var myCounter = 0; 
myInterval = setInterval(function(){ 
    myCounter++; 

    $("#counter-display").html("Count: "+myCounter); 
}); 

myInterval sera maintenant déclaré dans la portée globale.

Vous pouvez bien sûr utiliser clearInterval, et faire clearInterval(myInterval) qui assurera également que seulement sur l'instance de l'intervalle est en cours d'utilisation.

+0

Si vous chargez ce code deux fois, il n'est pas considéré comme global, cela ne fonctionnerait donc pas. clearInterval effacerait seulement le myInterval qui a été chargé, mais pas le second myInterval chargé. confusion – Joe

+0

Une variable est déclarée globale sauf si l'instruction var est utilisée. 'myInterval = ....' rend myInterval global; presque équivalent à 'window.myInterval = ...' – Matt