2010-06-17 6 views
1

J'ai un simple diaporama qui change automatiquement l'image en utilisant setInterval toutes les 5 secondes.réinitialisation de la minuterie sur setInterval sans clearInterval

L'utilisateur peut également passer d'une image à l'autre en utilisant les liens précédents et suivants. Si l'utilisateur clique sur les liens précédent/suivant, le temporisateur n'est pas interrompu. Par exemple, si le temporisateur est activé pendant 3 secondes lorsque l'utilisateur clique sur le lien, l'image suivante n'est affichée que 2 secondes avant d'être modifiée à nouveau .

Je sais que je pourrais le faire en utilisant clearInterval, puis en utilisant à nouveau setInterval, mais y a-t-il un moyen plus propre?

Voici mon code si vous en avez besoin:

//Move to next image every 10 seconds unless paused. 
var timeInterval = 5000; 
var featureSlide = window.setInterval(function() { nextFeature("next")}, timeInterval); 

$("a#feature-prev").click(function() {   
    nextFeature("prev"); 
    return false; 
}); 

$("a#feature-next").click(function() { 
    nextFeature("next"); 
    return false; 
}); 



function nextFeature(action) { 

    var idNow = $("ul#features li:visible").attr("id"); 
    var pos = idNow.replace("feature-", ""); 

    //If image is currently animated do nothing 
    //If this isn't in place then multiple images are displayed 
    if ($("li#" + idNow).is(":animated")) { 
     return; 
    } else { 

     if (pos == 4 && action == "next") { 
      pos = 1; 
     } else if (pos != 4 && action == "next") { 
      pos++; 
     } else if (pos !=1 && action == "prev") { 
      pos--; 
     } else if (pos == 1 && action == "prev") { 
      pos = 4 
     } 


     pos = "feature-" + pos; 
     // Slide to next image 
     $("li#" + idNow).hide("slide", { direction: "right" }, 1000, function() { 
      $("li#" + pos).show("slide", { direction: "left"}, 1000); 
     }); 


    } 
} 

Merci!

Répondre

1

Vous ne pouvez pas redémarrer la minuterie sans l'annuler et la redémarrer.

Vous pouvez également arrêter complètement d'utiliser setInterval et utiliser simplement setTimeout. Prévoyez le suivant chaque fois que vous montrez une image (juste après le show dans nextFeature si je lis bien votre code). Ensuite, la réinitialisation d'intervalle se produit comme un sous-produit de votre flux logique, plutôt que d'être une chose spéciale.

+0

Merci pour cela. Je pense que je vais rester avec setInterval car la même fonction doit être appelée toutes les 5 secondes, sauf si l'utilisateur clique sur les liens prev/next. Je vais ajouter clearInterval et ensuite utiliser setInterval à nouveau pour redémarrer le timer au début de nextFeature. –

+0

@Phil: Cool. BTW, semble que j'ai mal interprété votre code. Si vous utilisiez l'approche 'setTimeout', vous devriez le faire après l'appel' hide', pas l'appel 'show' (désolé, il manquait un callback d'achèvement). Si vous faisiez cela, ce serait toutes les cinq secondes à la résolution de n'importe quel minuteur du navigateur. MAIS, vous devrez gérer le cas plus haut où l'animation se passe encore, ce qui pourrait s'opposer à cette approche ... Amusez-vous! –

Questions connexes