Botões para iniciar e parar um temporizador em JavaScript

Agora vamos criar dois botões: ao clicar no primeiro, o temporizador deve iniciar, e ao clicar no segundo - parar. Aqui já não será tão simples e nos espera uma armadilha. Para entender a essência dessa armadilha, vou descrever a criação do código passo a passo.

Então, vamos fazer dois botõezinhos:

html<button id="start">start</button>
<button id="stop">stop</button>

Obtemos referências para esses botões em variáveis:

javascriptlet start = document.querySelector('#start');
let stop  = document.querySelector('#stop');

Ao clicar no primeiro botão, iniciamos o temporizador, armazenando seu número em uma variável:

javascriptstart.addEventListener('click', function() {
  let timerId = setInterval(function() {
    console.log('!')
  }, 1000);
});

E agora vamos parar o temporizador ao clicar no segundo botão:

javascriptstart.addEventListener('click', function() {
  let timerId = setInterval(function() {
    console.log('!')
  }, 1000);
});

// Paramos o temporizador:
stop.addEventListener('click', function() {
  clearInterval(timerId);
});

No entanto, se tentarmos executar o código acima, nos surpreenderemos: ao tentar parar o temporizador, veremos que a variável timerId é igual a undefined! Por que isso aconteceu? Porque ao iniciar o temporizador, tornamos nossa variável timerId local dentro da função vinculada ao botão start.

Para resolver o problema, vamos tornar a variável timerId global - neste caso, ela estará acessível tanto na função de iniciar o temporizador quanto na função de parada:

javascriptlet timerId; // tornamos a variável global

start.addEventListener('click', function() {
  timerId = setInterval(function() {
    console.log('!')
  }, 1000);
});

stop.addEventListener('click', function() {
  clearInterval(timerId);
});
Задание 1

Suponha que exista uma variável que inicialmente armazena o número 100. Também existem dois botões. Ao clicar no primeiro botão, inicie um temporizador que a cada segundo diminuirá o valor da variável em 1 e exibirá o novo valor no console. Assim que o valor da variável atingir zero - pare o temporizador.

Ao clicar no segundo botão, pare o temporizador. Também pare o temporizador se o segundo botão não for clicado, mas o valor da variável atingir zero.

Задание 2

Um determinado programador escreveu um código que ao clicar em um botão inicia um temporizador, exibindo no console o horário atual:

html<input type="submit" id="start" value="start">
<input type="submit" id="stop"  value="stop">
javascriptlet start = document.querySelector('#start');
let stop  = document.querySelector('#stop');

start.addEventListener('click', function() {
  let timerId = setInterval(function() {
    let date = new Date;
    console.log(date.getMinutes() + ' ' + date.getSeconds());
  }, 1000);
});

stop.addEventListener('click', function() {
  clearInterval(timerId);
});

Após a execução do código, no entanto, descobriu-se que o botão de parada não funciona. Corrija o erro do autor do código.

Задание 3

Outro programador também escreveu um código para resolver a tarefa anterior:

html<input type="submit" id="start" value="start">
<input type="submit" id="stop"  value="stop">
javascriptlet start = document.querySelector('#start');
let stop  = document.querySelector('#stop');

let timerId;

start.addEventListener('click', function() {
  let timerId = setInterval(function() {
    let date = new Date;
    console.log(date.getMinutes() + ' ' + date.getSeconds());
  }, 1000);
});

stop.addEventListener('click', function() {
  clearInterval(timerId);
});

Após a execução do código, no entanto, novamente descobriu-se que o botão de parada não funciona. Corrija o erro do autor do código.

Задание 4

Outro programador também escreveu um código para resolver a tarefa anterior:

html<input type="submit" id="start" value="start">
<input type="submit" id="stop"  value="stop">
javascriptlet start = document.querySelector('start');
let stop  = document.querySelector('stop');

let timerId;

start.addEventListener('click', function() {
  setInterval(function() {
    let date = new Date;
    console.log(date.getMinutes() + ' ' + date.getSeconds());
  }, 1000);
});

stop.addEventListener('click', function() {
  clearInterval(timerId);
});

Após a execução do código, no entanto, novamente descobriu-se que o botão de parada não funciona. Corrija o erro do autor do código.

Задание 5

Outro programador também escreveu um código para resolver a tarefa anterior:

html<input type="submit" id="start" value="start">
<input type="submit" id="stop"  value="stop">
javascriptlet start = document.querySelector('start');
let stop  = document.querySelector('stop');

let timerId;

start.addEventListener('click', function() {
  let timerId = setInterval(function() {
    let date = new Date;
    console.log(date.getMinutes() + ' ' + date.getSeconds());
  }, 1000);
});

stop.addEventListener('click', function() {
  clearInterval();
});

Após a execução do código, no entanto, novamente descobriu-se que o botão de parada não funciona. Corrija o erro do autor do código.

Задание 6

O código que apresentei na parte teórica não leva em consideração que o botão iniciar pode ser clicado várias vezes. Para corrigir esse problema, é possível, ao clicar no botão iniciar, desvincular o evento desse botão, e ao clicar no botão parar - vinculá-lo novamente. Corrija o problema.