Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Função reiniciaJogo

No módulo 1 do jQuery, se clicarmos no link de reiniciar o jogo várias vezes, ele executa a função várias vezes e, ao fim do tempo, adiciona linhas no ranking de acordo com a quantidade de vezes que o botão foi clicado. Eu transformei o link em um botão e mantive ele desabilitado enquanto o tempo está contando. Porém se eu realizar essa repetição de cliques antes de entrar no campo de digitação, acontece a mesma coisa. Como eu posso evitar isso?

Segue meu código:

         <button id="reset-game" class="btn-floating btn-large waves-effect waves-light red">
            <i class="material-icons">restore</i>
        </button>
</div>
var tempoInicial = $('#tempo-digitacao').text();

function atualizaCronometro(){
    var tempo = $('#tempo-digitacao').text();
    campo.one("focus", function(){
        $("#reset-game").attr("disabled", true);
        var contagemID = setInterval(function(){
            tempo--;
            $('#tempo-digitacao').text(tempo);
            if(tempo < 1){
                finalizaJogo();
                clearInterval(contagemID);
            }    
        }, 1000);
    });
}

function reiniciaJogo(){
    campo.val("");
    campo.removeAttr("disabled");
    $("#contador-palavras").text("0");
    $("#contador-caracteres").text("0");
    $("#tempo-digitacao").text(tempoInicial);
    campo.removeClass("campo-desativado");
    campo.removeClass("campo-correto");
    campo.removeClass("campo-errado");
    atualizaCronometro();
}

function finalizaJogo(){
    campo.attr("disabled", true);
    campo.addClass("campo-desativado");
    $("#reset-game").removeAttr("disabled");                    
    inserePlacar();
}
5 respostas
solução!

Fala aí Renan, beleza? Para evitar esse tipo de problema você pode aplicar a técnica de Debounce, nada mais é do que:

Esperar um intervalo de pausa para de fato executar a tarefa.

A implementação pode ser feita com o setTimeout:

let timeout;
clearTimeout(timeout)
timeout = setTimeout(() => console.log('Ola'), 500);

Basicamente seria isso, você sempre faz o clearTimeout quando clicar no botão, dai estou passando um intervalo de meio segundo, se por um acaso ele não clicar nesse tempo aí sim será executada a função, porém, se ele clicar, vai ser resetado o timeout e um novo será agendado.

Espero ter ajudado.

Matheus, beleza e contigo?

Teria alguma maneira de fazer isso sem um tempo definido? Na função atualizaCronometro(), por exemplo, a gente consegue fazer a função do evento "focus" não se repetir através no "one". Mas não consegui fazer da mesma forma.

Fala aí Renan, bom, o padrão debounce é aplicado dessa maneira, desconheço outro jeito de utilizá-lo.

Teria N maneiras de resolver esse problema, porém, a mais fácil e recomendada seria essa mesmo.

Abraços

Era pra ser uma pergunta e eu acabei cometendo um erro de digitação. Mas esse exemplo que você deu realmente já evitou uma falha. Muito obrigado, Matheus!

Mágina, precisando não deixe de criar suas dúvidas.

Abraços