it-swarm-pt.tech

Como iniciar e parar / pausar setInterval?

Estou tentando fazer uma pausa e depois reproduzir um loop setInterval.

Depois de parar o loop, o botão "Iniciar" em minha tentativa parece não funcionar:

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 uma maneira de fazer isso?

23
Web_Designer

O motivo pelo qual você está vendo esse problema específico:

O JSFiddle agrupa seu código em uma função, portanto start() não está definido no escopo global .

enter image description here


Moral da história: não use ligações de eventos em linha. Use addEventListener /attachEvent.


Outras notas:

Por favor não passe strings para setTimeout e setInterval. É eval disfarçado.

Use uma função e fique confortável com var e espaço em branco:

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

Veja a demonstração de trabalho no 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

Como você marcou este jQuery ...

Primeiro, coloque os IDs nos botões de entrada e remova os manipuladores embutidos:

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

Em seguida, mantenha todo o seu estado e funções encapsulados em um fechamento:

[~ # ~] edit [~ # ~] atualizado para uma implementação mais limpa, que também aborda as preocupações de @ Esailija sobre o uso 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
});

Isso garante que nenhuma de suas variáveis ​​vaze para o escopo global e não possa ser modificada de fora.

(Atualizado) demonstração de trabalho em http://jsfiddle.net/alnitak/Q6RhG/

9
Alnitak

add é uma variável local e não uma variável global, tente isso

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