2011-07-06 7 views
2

Voici mon code:jQuery setInterval ne fonctionne pas

$(document).ready(function() { 
    var interval = setInterval("change_height()", 500); 
    var height; 

    function change_height() { 
     height = parseInt(window.location.hash); 
     $('#message_body').height(height); 
     alert(""); 
     clearInterval(interval); 
    } 
}); 

pour une raison quelconque la fonction change_height() est tout simplement pas être appelé mais il fonctionne si je le mets en dehors du bloc document.ready mais le clearInterval ne fonctionne pas!

Toute aide très appréciée.

Merci

+0

Vous devriez essayer de mettre la fonction « intervalle » var et le « change_height » extérieur du « document.ready » –

+0

Il ne fonctionne pas parce que 'change_height' est uniquement local au gestionnaire d'événements' ready', mais la chaîne passée à 'setInterval' est évaluée dans la portée globale. Passez directement la référence de la fonction, comme le suggère @Alexander. Une autre question: Pourquoi utilisez-vous 'setInterval' si vous l'effacez après la première exécution? Un simple 'setTimeout' serait suffisant. –

Répondre

2

setInterval est une fonction javascript natif et non une fonction jQuery.

Cela éclairci, essayez le référencement simplement la fonction en utilisant directement:

var interval = setInterval(change_height, 500); 
    // Note the lack of() which would execute the function 

Cela vaut mieux que de laisser la fonction setInterval interpréter la chaîne.

+1

+1 Ce n'est pas seulement mieux, c'est la façon de le faire fonctionner. C'est un problème de portée. –

+0

Votre commentaire m'a fait curieux, il peut en effet être rapidement expliqué à ce qui suit: 'setInterval ('change_height()', 500);' serait évalué pour appeler une fonction de 'window.change_height()', cependant, cette la fonction n'existe pas. Une autre solution possible pourrait alors consister à déplacer le paramètre change_height() vers la portée globale, mais ceci est une mauvaise pratique et devrait être évité. L'utilisation de 'setInterval (change_height, 500)' comme prévu était la meilleure des deux solutions. –

+0

Exactement. Évite également la pollution de l'espace de noms global. Il n'y a jamais de raison de passer une chaîne à ces méthodes ... Je me demande qui a voté votre réponse si: -/(et pourquoi). –

1
$(document).ready(function() { 
    var interval = setInterval(function() { change_height(); }, 500); 
    var height; 

    function change_height() { 
     height = parseInt(window.location.hash); 
     $('#message_body').height(height); 
     alert(""); 
     clearInterval(interval); 
    } 
}); 
1

cordes passe Dont à setInterval, passez la référence de fonction:

$(document).ready(function() { 
    var interval; 
    var height; 

    function change_height() { 
     height = parseInt(window.location.hash); 
     $('#message_body').height(height); 
     alert(""); 
     clearInterval(interval); 
    } 
    interval = setInterval(change_height, 500); 

}); 
0

essayer cet exemple de code:

var intervalId; 

$(document).ready(function() { 
    intervalId = window.setInterval('sample.func1();', 500); 
}); 

var sample = { 
    func1: function() { 
     alert('test 1'); 
     window.clearInterval(intervalId); 
    } 
} 
0

Vous avez 2 choix:

1) Retirez le parenthèses et citations de setInterval:

setInterval(change_height, 500); 

OU 2) Déclarez votre fonction globale:

window.change_height = function() { 
    height = parseInt(window.location.hash); 
    $('#message_body').height(height); 
    alert(""); 
    clearInterval(interval); 
} 

En effet, lorsque vous utilisez "change_height()", setInterval était à la recherche d'une fonction globale, mais votre fonction était locale.

Espérons que cela aide. Bravo

0

Utilisez settimeout. Parce que setinterval s'exécute indépendamment du code est terminé. Et appelez le settimeout de la dernière ligne de votre fonction.

setTimeOut("change_height", 500); 
Questions connexes