1646 votes

Arrêtez l'appel setInterval en JavaScript

Je utilise setInterval(fname, 10000); pour appeler une fonction toutes les 10 secondes en JavaScript. Est-il possible de cesser cet appel sur un certain événement?

Je veux que l'utilisateur soit capable d'arrêter le rafraîchissement répété de données.

-1voto

gab Points 820
var interval = setInterval(timer, 100);
var n = 0;

function timer() {
  n = n + 0.1
  document.getElementById('show').innerHTML = n.toFixed(2)
}
function pause() {
  clearInterval(interval)
}
function resume(){
  interval = setInterval(timer, 100)
}

0
ARRÊT
REPRENDRE

-2voto

Aart den Braber Points 152

Pourquoi ne pas utiliser une approche plus simple ? Ajoutez une classe !

Ajoutez simplement une classe qui indique à l'intervalle de ne rien faire. Par exemple, au survol.

var i = 0;
this.setInterval(function() {
  if(!$('#counter').hasClass('pauseInterval')) { //exécuter uniquement s'il n'a pas cette classe 'pauseInterval'
    console.log('Comptage en cours...');
    $('#counter').html(i++); //juste pour expliquer et montrer
  } else {
    console.log('Comptage arrêté');
  }
}, 500);

/* Dans cet exemple, j'ajoute une classe lorsque la souris passe dessus et la retire à nouveau lorsque la souris quitte. Vous pouvez bien sûr faire à peu près ce que vous voulez */
$('#counter').hover(function() { //survol de la souris
    $(this).addClass('pauseInterval');
  },function() { //quitter avec la souris
    $(this).removeClass('pauseInterval');
  }
);

/* Autre exemple */
$('#pauseInterval').click(function() {
  $('#counter').toggleClass('pauseInterval');
});

body {
  background-color: #eee;
  font-family: Calibri, Arial, sans-serif;
}
#counter {
  width: 50%;
  background: #ddd;
  border: 2px solid #009afd;
  border-radius: 5px;
  padding: 5px;
  text-align: center;
  transition: .3s;
  margin: 0 auto;
}
#counter.pauseInterval {
  border-color: red;  
}

 
Pause

Je cherchais cette approche rapide et facile depuis des années, donc je poste plusieurs versions pour la présenter au plus grand nombre de personnes possible.

17 votes

Ne me semble pas vraiment plus simple... Je pense aussi qu'il est plus propre de supprimer vos intervalles plutôt que de garder des appels à des fonctions qui ne font rien.

0 votes

Je ne suis pas d'accord. this.setInterval(function() { if(!$('#counter').hasClass('pauseInterval')) { //faire quelque chose } }, 500); est tout ce que vous avez pour le code. De plus, la vérification est la première chose que vous faites, donc c'est très léger quand on survole. C'est à cela que sert celui-ci: suspendre temporairement une fonction. Si vous voulez le terminer indéfiniment: bien sûr, vous supprimez l'intervalle.

0 votes

Cela équivaut à un sondage et est généralement découragé. Cela réveillera le CPU des états de faible consommation juste pour effectuer une vérification (probablement) inutile. Cela retarde également les commentaires de immédiat à entre 0 et 500 ms dans cet exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X