web-dev-qa-db-fra.com

Comment démarrer et arrêter / mettre en pause setInterval?

J'essaie de faire une pause, puis de lire une boucle setInterval.

Après avoir arrêté la boucle, le bouton "démarrer" dans ma tentative ne semble pas fonctionner:

input = document.getElementById("input");

function start() {
  add = setInterval("input.value++", 1000);
}
start();
<input type="number" id="input" />
<input type="button" onclick="clearInterval(add)" value="stop" />
<input type="button" onclick="start()" value="start" />

Existe-t-il une méthode de travail pour ce faire?

23
Web_Designer

La raison pour laquelle vous voyez ce problème spécifique:

JSFiddle encapsule votre code dans une fonction, donc start() n'est pas défini dans la portée globale .

enter image description here


Morale de l'histoire: n'utilisez pas de liaisons d'événements en ligne. Utilisez addEventListener /attachEvent.


Autres notes:

Veuillez ne pas passer de chaînes à setTimeout et setInterval. C'est eval déguisé.

Utilisez plutôt une fonction et familiarisez-vous avec var et les espaces blancs:

var input = document.getElementById("input"),
  add;

function start() {
  add = setInterval(function() {
    input.value++;
  }, 1000);
}

start();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="number" id="input" />
<input type="button" onclick="clearInterval(add)" value="stop" />
<input type="button" onclick="start()" value="start" />
17
Matt Ball

Voir la démonstration de travail sur jsFiddle: http://jsfiddle.net/qHL8Z/3/

$(function() {
  var timer = null,
    interval = 1000,
    value = 0;

  $("#start").click(function() {
    if (timer !== null) return;
    timer = setInterval(function() {
      $("#input").val(++value);
    }, interval);
  });

  $("#stop").click(function() {
    clearInterval(timer);
    timer = null
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="number" id="input" />
<input id="stop" type="button" value="stop" />
<input id="start" type="button" value="start" />
35
jessegavin

Comme vous avez marqué ce jQuery ...

Tout d'abord, mettez des ID sur vos boutons de saisie et supprimez les gestionnaires en ligne:

<input type="number" id="input" />
<input type="button" id="stop" value="stop"/>
<input type="button" id="start" value="start"/>

Ensuite, gardez tous vos états et fonctions encapsulés dans une fermeture:

[~ # ~] modifier [~ # ~] mis à jour pour une implémentation plus propre, qui répond également aux préoccupations de @ Esailija concernant l'utilisation de setInterval().

$(function() {
    var timer = null;
    var input = document.getElementById('input');

    function tick() {
        ++input.value;
        start();        // restart the timer
    };

    function start() {  // use a one-off timer
        timer = setTimeout(tick, 1000);
    };

    function stop() {
        clearTimeout(timer);
    };

    $('#start').bind("click", start); // use .on in jQuery 1.7+
    $('#stop').bind("click", stop);

    start();  // if you want it to auto-start
});

Cela garantit qu'aucune de vos variables ne fuit dans la portée globale et ne peut pas être modifiée de l'extérieur.

(Mise à jour) démonstration de travail sur http://jsfiddle.net/alnitak/Q6RhG/

9
Alnitak

ajouter est une variable locale et non une variable globale, essayez ceci

var add;
var input = document.getElementById("input");

function start() {
  add = setInterval("input.value++", 1000);
}
start();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="number" id="input" />
<input type="button" onclick="clearInterval(add)" value="stop" />
<input type="button" onclick="start()" value="start" />
3
Jazz Man
(function(){
    var i = 0;
    function stop(){
        clearTimeout(i);
    }

    function start(){
        i = setTimeout( timed, 1000 );
    }

    function timed(){
       document.getElementById("input").value++;
       start();
    }

    window.stop = stop;
    window.start = start;
})()

http://jsfiddle.net/TE3Z2/

1
Esailija