Eu tenho essa página web
com uma foto de "Oh Noes"
que está enlouquecendo porque
o mundo vai acabar em breve -
especificamente, em 500 segundos.
Eu quero fazer essa página web muito
mais útil transformando esse número
em uma contagem regressiva
para que os visitantes possam ver
exatamente quanto tempo eles têm sobrando.
Quando animamos parte de uma página web,
a estratégia é achar algum elemento nela
e então mudar algo nesse elemento,
e fazer isso um certo número
de vezes por segundo.
Então, para o primeiro passo,
vou achar a contagem regressiva pelo ID.
Simples.
(digitando)
Para o segundo passo, vou fazer uma função
que executa uma contagem regressiva.
(digitando)
E o que vamos fazer...
Eu quero definir o 'textContent',
e eu quero que ele seja igual
ao número anterior menos um.
E o 'textContent' vai ser
uma cadeia de caracteres.
Então temos que tranformá-lo em um número.
Você pode fazer isso usando 'parsefloat()'
e então podemos subtrair um dele.
Então, finalmente, queremos chamar
essa função em um intervalo,
o que significa um certo
número de vezes por segundo.
E podemos fazer isso usando
'window.setInterval()'.
E essa função recebe dois argumentos:
a função de retorno de chamada e
o número de milissegundos para esperar
antes dessa função
ser chamada de novo.
Nós podemos especificar
a função de retorno de chamada
do mesmo jeito que especificamos
para ouvintes de evento: pelo nome.
E então, está indo
muito rápido agora
porque não especificamos
o segundo argumento.
Quanto a isso, queremos que ele seja
um certo número de milissegundos,
e queremos uma vez por segundo,
então vamos colocar um mil
porque existem um mil
milissegundos em um segundo.
Pronto, agora está
diminuindo um por segundo.
Então é melhor você aprender o máximo que
você puder nos próximos 490 segundos!
Há mais uma função de window que
usamos às vezes no lugar de 'setInterval',
e ela é 'setTimeout'.
E eu vou mudar para ela, e ver
se você consegue notar a diferença.
Tem que esperar um pouco.
Pronto, agora talvez você consiga ver
que quando usamos 'setTimeout',
o navegador apenas chama
a função uma vez, não repetidamente.
Isso não é tão útil para quando
estamos fazendo animações.
Mas pode ser super útil em outros casos,
como se mostrarmos um aviso
para nossos usuários e quiséssemos
escondê-lo após dez segundos.
Então deixe-me mudar isso
de volta para 'setInterval'
Agora, quando estamos
testando animações desse jeito,
deveríamos realmente ver como elas ficam
em todos os pontos da animação,
como o que acontece
quando chega a zero.
Bem, vai demorar um
bom tempo para chegar lá,
e você vai ficar
muito entediado
então vamos apenas mudar
nosso dado inicial para cinco,
e ver o que acontece.
Quatro, três, dois, um, zero...
Menos um, menos dois.
Agora isso está ficando estranho.
Quando o mundo acaba, ele deveria
apenas fazer "Kabum!" e parar de contar.
Então o que nós queremos fazer
na verdade é parar essa animação
uma vez que ela chegue ao zero.
E podemos fazer isso usando
uma condição if dentro da função.
Então, deixe-me começar guardando
o tempo atual em uma variável
já que vamos usá-lo
algumas vezes.
Então eu vou apenas pegar isso, colocar
aqui e substituir isso com 'currentTime'
Agora, o que eu posso fazer é
ter uma condição if para ter certeza
que apenas vamos atualizar o texto
se 'currentTime' for maior que zero.
Esse é o único momento em que
realmente queremos subtrair um.
Então eu vou precisar
colocar isso aqui dentro.
Isso funciona, mas tem algo
muito ruim nessa abordagem.
O navegador ainda está chamando
a função 'countItDown' uma vez por segundo
enquanto a página web está aberta.
Você não deveria fazer navegadores
chamarem funções sem motivo,
eles tem muitas outras coisas
importantes para fazer.
O que queremos mesmo fazer
é dizer ao navegador que
uma vez que chegue a zero, ele
não precisa mais chamar essa função.
Podemos fazer isso usando um novo
método: 'window.clearInterval()'.
Podemos colocá-lo nesse else aqui -
'window.clearInterval()'.
Agora, precisamos passar um argumento
para que ele saiba qual intervalo remover.
Porque podemos ter vários
intervalos em uma página.
O jeito de sabermos
qual intervalo remover
é guardar o resultado de
'setInterval' em uma variável.
Então, agora que eu tenho ele em uma
variável 'timer', posso copiar e colar ali
e agora ela sabe o que remover,
então quando chegar a zero
deve parar de atualizar e
deve parar de chamar a função.
Para cada animação que você faz,
você deveria pensar cuidadosamente sobre
qual deveria ser a
condição de parada.
E sim, você pode ter algumas animações
que devem repetir e repetir, meus amigos -
mas é melhor que elas
sejam animações muito boas.
Porque seu navegador
está trabalhando toda vez
que chama essa função
de retorno de chamada.
Agora faça sua versão e faça
o mundo realmente fazer "Kabum!".
[Legendado por: Alberto Oliveira]