1
resposta

Função perdida no script (?)

``Sempre passo no fórum para ver as dúvidas dos colegas como forma de acrescentar algo que não percebi. Existe uma dúvida no fórum de um colega de curso, na qual ele questiona o por quê de chamar a função reiniciaJogo duas vezes.

Segue o texto literal com a dúvida dele: "Não entendo pq o trecho

$("#botao-reiniciar").click(reiniciaJogo);

aparece duas vezes. Uma seria dentro da função principal do jQuery e outra vez fora da função principal do jQuery.

Testei removendo o trecho que aparece fora da função principal e vi que há uma diferença no funcionamento do cronometro, mas não entendo o pq. "

Segue também a resposta de um outro colega para a dúvida acima:

" essa linha fora da função de inicialização abstraída pelo jQuery $(function), não precisaria existir, inclusive ela pode vir a causa algum erro.

Quando utilizados o $(function) com jQuery, essa função so sera chamada quando o Browser terminar de carregar o site, assim todos os elementos já vão existir, assim será possivel registrar eventos a eles. Quando jogamos esse registro no corpo no javascript ele é executado assim que o script é carregado, podendo ter ou não carregado os elementos do HTML, assim podendo não associar o evento como deveria. "

Porém, eu fiz o teste eu o botão não reage sem essa função aí "perdida" no meio do script. Ou seja, ela é necessária. Por quê?``

var campo = $(".campo-digitacao"); //selecionando o textarea
var tempoInicial = $("#tempo-digitacao").text(); //selecionando o span de tempo e extraindo o seu conteúdo de texto



$(function() {
  atualizaTamanhoFrase();
  inicializaContadores();
  inicializaCronometro();
  $("botao-reiniciar").click(reiniciaJogo);
});

//Funções
function atualizaTamanhoFrase() {

  var frase = $(".frase").text(); //acessando o elemento o conteúdo do parágrafo
  var numPalavras = frase.split(" ").length; // separando as palavras da frase a cada espaço. / retorna um array
  var tamanhoFrase = $("#tamanho-frase"); //selecionando o elemento span
  tamanhoFrase.text(numPalavras); //alterando o conteúdo do elemento span com o retorno da função split

}

function inicializaContadores() {

  campo.on("input", function() {
    var conteudo = campo.val(); //recuperando o valor do textarea

    var qtdPalavras = conteudo.split(/\S+/).length - 1; //contando a quantidade de palavras
    $("#contador-palavras").text(qtdPalavras); //alterando o conteúdo do elemento span palavras

    var qtdCaracteres = conteudo.length; //contando os caracteres
    $("#contador-caracteres").text(qtdCaracteres); //alterando o conteúdo do elemento span caracteres

  }); //escutando um evento de input
}

function inicializaCronometro() {
  var tempoRestante = $("#tempo-digitacao").text(); // selecionando o span e extraindo o seu conteúdo de texto

  campo.one("focus", function() {
    var cronometroID = setInterval(function() {
      tempoRestante--;
      $("#tempo-digitacao").text(tempoRestante); //gerando a interação do decremento aqui
      if(tempoRestante < 1) {
        campo.attr("disabled", true); // desabilitando o textarea
        clearInterval(cronometroID); //interrompendo o setInterval
      }
    }, 1000); // decrementando o valor do meu span com o setInterval

  });// escutando o eventos focus no textarea, apenas 1 incidência de evento
}

$("#botao-reiniciar").click(reiniciaJogo);

function reiniciaJogo() {
  campo.attr("disabled", false); // habilitando novamente o textarea
  campo.val(""); //limpando o textarea

  $("#contador-palavras").text("0"); // zerando o contador de palavras
  $("#contador-caracteres").text("0"); // zerando o contador de caracteres

  $("#tempo-digitacao").text(tempoInicial); // reiniciando o tempo digitação

  inicializaCronometro(); //reiniciando o contador de tempo

}
1 resposta

Boa tarde Geovane.

Também gosto de ver o forum pra tentar absorver algo a mais.

Eu lembro de ter visto este post e se não me engano, um amigo tirou a duvida.

Na primeira declaração não está sendo informando o seletor do css e no segundo sim.

Troque:
$("botao-reiniciar").click(reiniciaJogo);
Por:
$("#botao-reiniciar").click(reiniciaJogo);

Espero ter ajudado.