En utilisant jQuery, j'ai créé un rotateur image/diapositive. La configuration de base est (en pseudocode):Arrête une fonction javascript récursive en cours d'exécution
function setupUpSlide(SlideToStartWith){
var thisSlide = SlideToStartWith;
...set things up...
fadeInSlide(thisSlide)
}
function fadeInSlide(thisSlide){
...fade in this slide...
fadeOutSlide(thisSlide)
}
function fadeOutSlide(thisSlide){
...fade out this slide...
thisSlide.fadeOut(fade, function() {
var timeout2 = setTimeout(setupUpSlide(nextSlide),100);
}
J'appelle la première fonction et passer dans un index de diapositive, puis il le fait de sa chaîne d'appel chose de fonctions qui alors, à son tour, appelle à nouveau la première fonction passant dans l'index suivant. Cela se répète alors indéfiniment (en réinitialisant l'index quand il arrive au dernier élément).
Cela fonctionne très bien.
Ce que je veux faire maintenant, c'est permettre à quelqu'un de dépasser le diaporama en étant capable de cliquer sur un numéro de diapositive particulier. Par conséquent, si la diapositive n ° 8 est affichée et que je clique sur n ° 3, je souhaite que la récursion s'arrête puis appelez la fonction initiale passant dans la diapositive n ° 3, qui à son tour relancera le processus.
Mais je ne suis pas sûr de savoir comment y arriver. Comment peut-on «casser» un script récursif? Devrais-je créer une sorte de variable globale 'watch' qui, si à tout moment est 'true', retournera: false et permettra à la nouvelle fonction de s'exécuter?
MISE À JOUR: Ajout de code plus détaillé montrant appel setTimeout
À un certain point, cependant, n'ai-je pas besoin de la récursivité pour continuer la boucle? Autrement dit, si j'ai 6 diapositives, je dois aller de 1 à 6, puis répéter. En utilisant les méthodes Timeout ci-dessus, comment intégrer la logique for-loop pour incrémenter les appels? –
@DA: En utilisant les délais d'expiration, vous pouvez créer une boucle infinie sans provoquer de débordement de pile. Chaque appel représente une étape dans votre boucle. –
ack. Aurait dû regarder ce que j'avais déjà plus près. Il s'avère que nous utilisons une fonction setTimeout dans la dernière fonction (qui à son tour appelle le premier). J'ai mis à jour l'exemple de code dans le message d'origine. Est-ce tout ce qu'il faut pour éviter le problème de débordement de la pile? –