Aprenda Javascript

  • Página Inicial
  • Contato!
  • Tudo sobre Javascript Parte 1!
  • Tudo sobre Javascript Parte 2!
  • Tudo sobre Javascript Parte 3!
  • Tudo sobre Javascript Parte 4!
  • Tudo sobre Javascript Parte 5!
  • Tudo sobre Javascript Parte 6!
  • Tudo sobre Javascript Parte 7!
  • Tudo sobre Javascript Parte 8!
  • Tudo sobre Javascript Parte 7

    Temporizadores

    Temporizadores permitem que você determine um intervalo de tempo para que uma função Javascript seja executada.

    Existem dois tipos, o que não se repete, que é o setTimeOut(), e o que se repete, que é o setInterval()

    Voltando a nossa lâmpada dos primeiros exercícios, chame por uma tag img a lâmpada apagada e a id luz.

    Crie esse código para ligarmos a lâmpada ao clicar nela:

    
    onload = function() { // O window.onload inicia automaticamente a execução do Javascript da função
        document.getElementById("luz").onclick = ligar; // Função chamada ao clicar
    };
            
    function ligar() {
        document.getElementById("luz").src = "imagens/lampada-acesa.jpg";
    }
    
    

    Para usarmos os temporizadores, podemos fazer assim:

    
    onload = function() { // O window.onload inicia automaticamente a execução do Javascript da função
        document.getElementById("luz").onclick = ligar; // Função chamada ao clicar
    };
            
    function ligar() {
        document.getElementById("luz").src = "imagens/lampada-acesa.jpg";
        setTimeout("desligar()", 3000); // Passe os milésimos de segundos
    }
    
    function desligar() {
        document.getElementById("luz").src = "imagens/lampada-apagada.jpg";
    }
    
    

    Dessa forma, o setTimeout executará apenas uma vez, 3 segundos após clicar na lâmpada.

    PS: Podemos colocar apenas a referência do nome da função, sem aspas, assim:

    
    setTimeout(desligar, 3000);
    
    

    Se necessário, podemos colocar o clearTimeout() para limpar o temporizador (sempre a última linha da função, caso esteja em uma), nesse caso precisamos de uma variável, assim:

    
    chave = setTimeout(desligar, 3000); // Criar uma variável global na função. Se necessário declara ela fora da mesma.
    
    

    E no onload coloque isso:

    
    clearTimeout(chave);
    
    

    Podemos usar o setInterval para criar um temporizador que se repete, por exemplo, esse para atualizar um relógio em tempo real, pra isso, crie uma tag span com a id horas, e esse código:

    
    onload = function() { // O window.onload inicia automaticamente a execução do Javascript da função
        setInterval(horaAtual, 1); // Quantidade de milissegundos.
    };
    
    function horaAtual() {
        let data = new Date();
    
        let dia = data.getDate();
        let mes = data.getMonth();
        let ano = data.getFullYear();
    
        let hora = data.getHours();
        let minu = data.getMinutes();
        let segu = data.getSeconds();
        let mili = data.getMilliseconds();
    
        let ds = data.getDay();
    
        let meses = ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"];
        let semana = ["Domingo", "Segunda-Feira", "Terça-Feira", "Quarta-Feira", "Quinta-Feira", "Sexta-Feira", "Sábado"];
    
        let saida = "Hoje é " + semana[ds] + ", Dia " + dia + " de " + meses[mes] + " de " + ano + ".";
        saida += "<br/>A hora atual é " + ("00" + hora).slice(-2) + ":" + ("00" + minu).slice(-2) + ":" + ("00" + segu).slice(-2) + "." + ("000" + mili).slice(-3) + ".";
    
        document.getElementById("horas").innerHTML = saida;
    }
    
    

    PS: Podemos utilizar uma lambda no lugar do function do onload.

    Cookies

    Primeiro, crie uma variável com um prompt dentro do window.onload assim:

    
    var nome = prompt("Qual o seu nome?");
    
    

    O problema é que esse tipo de variável, é destruída ao recarregar a página. Para salvar os dados mesmo se a página seja fechada ou carregada, usamos cookies, que salvam informações no computador do usuário.

    Voltando a nossa lâmpada, vamos fazer um programa que ao clicar a lâmpada, ela pergunte o nome do internauta e mostre uma saudação com o nome dele, e não peça novamente caso já tenha informado.

    Só que por questões de segurança do Javascript, eles não armazenam coisas como por exemplo, que executem programas ou códigos maliciosos. Mas é possível acessar eles remotamente, por exemplo.

    Para gravar os cookies, usamos document.cookie, com essa sintaxe:

    
    new Date().toUTCString();
    document.cookie = "nomeDoCookie=valorDoCookie; expires=data; path=localhost";
    
    

    O primeiro é o nome e o valor, expires define a data de expiração (sempre no formato GMT, podemos usar o método toGMTString() do objeto Date pra isso. Caso não passe nada, a expiração padrão é a sessão do navegador), e path é o domínio

    PS: Só podemos armazenar até 20 cookies por domínio.

    Para criar o cookie, podemos fazer uma função assim:

    
    function escreveCookie(nome, valor, dias) {
        // Por default, não existe expiração, o cookie dura uma sessão
        let expira = "";
    
        if(dias) {
            let data = new Date();
    
            data.setTime(data.getTime() + (dias * 24 * 60 * 60 * 1000));
            expira = "expires=" + data.toUTCString();
        }
    
        // Condição 2
    
        if(valor != "" && valor != null && valor != "null") {
            // Isso cria o cookie:
            document.cookie = nome + "=" + valor + "; " + expira + "; path=/";
        }
    }
    
    

    E para ler, podemos criar assim:

    
    function lerCookie(nome) {
        // Procura o cookie especificado e retorna o seu valor:
    
        let procuraNome = nome + "=";
        let cook = document.cookie.split(";");
    
        for(let i = 0; i < cook.length; i++) {
            let c = cook[i];
    
            while(c.charAt(0) == " ") {
                c = c.substring(1, c.length);
            }
    
            if(c.indexOf(procuraNome) == 0) {
                return c.substring(procuraNome.length, c.length);
            }
    
            return null;
        }
    }
    
    

    E pra apagar cookies:

    
    function apagaCookie(nome) {
        escreveCookie(nome, "", -1);
    }
    
    

    PS: Podemos colocar tudo isso num arquivo js para usarmos em todas as páginas.

    E no onload, colocamos assim:

    
    onload = function() { // O window.onload inicia automaticamente a execução do Javascript da função
        document.getElementById("luz").onclick = ligar;
        setInterval(apresentaHoras, 1000);
        
        let nome = lerCookie("nome");
        
        if(nome == null) {
            nome = prompt("Qual o seu nome?");
            escreveCookie("nome", nome, 7); // Nome do cookie, valor do cookie e dias de expiração.
        }
    };
    
    

    E altere o método ligar() dessa forma:

    
    function ligar() {
        document.getElementById("luz").src = "imagens/lampada-acesa.jpg";
        
        let nome = lerCookie("nome");
        
        if(nome != null) {
            alert("Você ligou a lâmpada, " + nome);
        }
        
        setTimeout("desligar()", 3000);
    }
    
    

    Funções Anônimas e Lambdas

    No Javascript, é possível criarmos expressões anônimas, usando essa sintaxe:

    
    function() {
    
    };
    
    

    PS: Note que não pode esquecer do ponto e vírgula no final delas.

    Para usar expressões anônimas, atribuímos ela a uma variável, dessa forma:

    
    var mostraExpr = function() {
        alert("Introdução à Expressão Lambda!");
    };
    
    

    PS: Podemos colocar as expressões numa só linha, mas atenção com o ponto e vírgula:

    
    var mostraExpr = function() {alert("Introdução à Expressão Lambda!");};
    
    

    Pra invocar uma função anônima, colocamos a variável atribuída seguida dos parênteses (mesmo se não existirem argumentos):

    
    var mostraExpr = function() {alert("Introdução à Expressão Lambda!");};
    
    mostraExpr();
    
    

    Outro exemplo, com parâmetro e retorno:

    
    var cubo = function(c) {return c * c * c;};
    
    alert(cubo(5));
    
    

    Podemos utilizar as expressões anônimas sem indicar function, nesse caso conhecidas como lambdas ou arrow functions, dessa forma:

    
    var mostraExpr = () => {
        alert("Introdução à Expressão Lambda!");
    };
    
    mostraExpr();
    
    

    E se forem numa só linha, podemos até tirar as chaves, simplificando:

    
    var mostraExpr = () => alert("Introdução à Expressão Lambda!");
    
    mostraExpr();
    
    

    Quando tiver algum retorno, podemos simplificar mais ainda, sem precisar indicar return:

    
    var cubo = (c) => c * c * c; // Não se indica return, nesse caso.
    
    alert(cubo(5));
    
    

    Também podemos usar lambdas em uma função forEach do objeto de um array:

    
    var bebidas = ["Água", "Suco", "Refrigerante"];
    
    // Teste sem lambda:
    for(let b of bebidas) {
        document.write(b + "<br/>");
    }
    
    // Teste com lambda:
    bebidas.forEach(b => document.write(b + "<br/>"));
    
    

    E também podemos passar lambdas em funções que recebem outras funções como argumentos, como o setInterval:

    
    let num = 1;
    
    setInterval(() => {
        console.log("Chamada " + num);
        num++;
    }, 2000);
    
    

    Integrando Javascript com HTML5

    Podemos, por exemplo, criar uma forma de ocultar e mostrar parte de um texto longo em HTML usando Javascript.

    Crie no HTML, esse código:

    
    <p>Não confunda anti-herói com vilão<span id="pontos">...</span><span id="mais">. O vilão é o inimigo do mocinho e o anti-herói é aquele cara de personalidade, que salva as pessoas, que vai atrás de seus objetivos, que movimenta o mundo, mas que se comporta de forma contrária aos heróis por não seguir as regras morais impostas pela sociedade. O lance dele é quebrar paradigmas, mas resolver os problemas.</span></p>
    
    <input type="button" value="Leia Mais" id="btLeia" onclick="leia()"/>
    
    

    E no estilo CSS dele, coloque apenas isso:

    
    #mais {
        display: none;
    }
        
    

    E no código Javascript, colocamos esse código aqui:

    
    function leia() {
        let pontos = document.getElementById("pontos");
        let mais = document.getElementById("mais");
        let btLeia = document.getElementById("btLeia");
    
        if(pontos.style.display == "none") {
            pontos.style.display = "inline";
            mais.style.display = "none";
            btLeia.value = "Leia Mais";
        }
        else {
            pontos.style.display = "none";
            mais.style.display = "inline";
            btLeia.value = "Leia Menos";
        }
    }
    
    

    Podemos também ocultar e mostrar senhas em campos password, para isso, primeiro defina isso no HTML:

    
    <label for="cSenha">Senha:</label><input type="password" name="tSenha" id="cSenha"/><br/>
    <input type="checkbox" name="tMost" id="cMost" onclick="mostOculSenha()"/><label for="cMost">Mostrar Senha</label>
    
    

    E no Javascript, criamos essa função:

    
    function mostOculSenha() {
        let senha = document.getElementById("cSenha");
    
        if(senha.type == "password") {
            senha.type = "text";
        }
        else {
            senha.type = "password";
        }
    }
    
    

    Para alerta de Caps Lock, podemos colocar ao lado do campo de senha, a seguinte tag span:

    
    <span id="alerta">CAPS LOCK Ativado!</span>
    
    

    Com o seguinte CSS:

    
    #alerta {
        display: none;
        color: red;
    }
    
    

    E o seguinte Javascript:

    
    document.addEventListener("keydown", function(event) {
        let estado = event.getModifierState("CapsLock");
        let alertaCaps = document.getElementById("alerta");
    
        if(estado) {
            alertaCaps.style.display = "inline";
        }
        else {
            alertaCaps.style.display = "none";
        }
    });
    
    

    Podemos também usar a tag output, assim:

    
    <form oninput="res.value = num.value">
        0<input type="range" name="num" min="0" max="100" value="50"/>100
        <br/>
        <output name="res">50</output>
    </form>
    
    

    O que permite utilizar assim:

    
    <form oninput="res.value = parseInt(n1.value) + parseInt(n2.value)">
        <input type="number" name="n1" min="0" max="100" value="0"/>
         + 
        <input type="number" name="n2" min="0" max="100" value="0"/>
         = 
        <output name="res">0</output>
    </form>