2
respostas

[DUVIDA] Botão Reiniciar

Bom dia,

Consegui realizar todos os ex. do Desafio mas tem algo que ainda me incomoda: o botão reiniciar, seguindo o algoritmo das aulas, fica revezando entre ON e OFF quando sorteamos por seguidas vezes. Além disso, mesmo desabilitado ele pode ser clicado.

Como solução eu tentei separar em duas diferentes funções botaoReiniciarOn(), botaoReiniciarOff(). Inseri a primeira dentro de sortear() e a segunda dentro de reiniciar(). Porém nesse caso o botão sempre fica como desabilitado (porém ainda clicável).

Alguma sugestão para contornar isso? Estou postando o meu código (ignorem alguns comentários / observações).

function sortear() {
    let quantidade = parseInt(document.getElementById('quantidade').value);
    let de = parseInt(document.getElementById('de').value);
    let ate = parseInt(document.getElementById('ate').value);
    let resultado = document.getElementById('resultado');
    resultado.innerHTML = `<label class="texto__paragrafo">Números sorteados:  nenhum até agora</label>`;

    if (ate <= de) { //mensagem de erro 1
        resultado.innerHTML = `<label class="texto__paragrafo">Campo "Do número" deve ser inferior ao campo "Até o número". Verifique!</label>`;
        return;
    }   else if(quantidade > (ate - de) +1){ //+1 porque inclui o número inicial também (de 9 a 11, por ex seriam 3 possiblidades (9, 10 e 11))
        resultado.innerHTML = `<label class="texto__paragrafo">Campo "Quantidade" deve ser inferior à diferença entre os campo "Até o número" e "Do número". Verifique!</label>`;
        return;
    } 
    else {

        let sorteados = [];
        let numero;

        for (let i = 0; i < quantidade; i++) {

            numero = obterNumeroAleatorio(de, ate);
            while (sorteados.includes(numero)) {
                numero = obterNumeroAleatorio(de, ate);
            }

            sorteados.push(numero);
        }


        resultado.innerHTML = `<label class="texto__paragrafo">Números sorteados:  ${sorteados}</label>`;
        alterarStatusBotao();
    }
}

function obterNumeroAleatorio(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

function reiniciar() {
    document.getElementById('quantidade').value = '';
    document.getElementById('de').value = '';
    document.getElementById('ate').value = '';
    document.getElementById('resultado').innerHTML = `<label class="texto__paragrafo">Números sorteados:  nenhum até agora</label>`;
    alterarStatusBotao();
}

function alterarStatusBotao() {
    let botao = document.getElementById("btn-reiniciar");

    if (botao.classList.contains('container__botao-desabilitado')) {
        //botao.classList.remove('container__botao-desabilitado');
        //botao.classList.add('container__botao');
        botao.classList.replace('container__botao-desabilitado', 'container__botao');//substituindo as duas linhas anteriores por essa
    } else {
        //botao.classList.remove('container__botao');
        //botao.classList.add('container__botao-desabilitado');
        botao.classList.replace('container__botao', 'container__botao-desabilitado');
    }
}


//testes Botao
function botaoReiniciarOn() {
    botao.classList.remove('container__botao-desabilitado');
    botao.classList.add('container__botao');
    //botao.classList.replace('container__botao-desabilitado', 'container__botao');
}

function botaoReiniciarOff() {
    botao.classList.remove('container__botao');
    botao.classList.add('container__botao-desabilitado');
    //botao.classList.replace('container__botao', 'container__botao-desabilitado');
2 respostas

Olá Caio, tudo bem?

Pra mim ocorria o mesmo, ai acabei modificando algumas coisas e fiquei satisfeito com o resultado. Se vc quiser dar uma olhada na minha solução, segue o código logo abaixo:

let quantidadeDeNumeros;
let doNumero;
let ateNumero;
let listaNumerosSorteados;

reiniciar();

function pegaValoresDigitados(){
  quantidadeDeNumeros = parseInt(document.getElementById('quantidade').value);
  doNumero = parseInt(document.getElementById('de').value);
  ateNumero = parseInt(document.getElementById('ate').value);
}

function exibirHTMLNaTela(tag, texto){
  console.log(`exibeTexto ${tag}, ${texto}`)
  let elemento = document.querySelector(tag);
  elemento.innerHTML = texto;
}

function alterarStatusBotaoReiniciar(){
  let botao = document.getElementById('btn-reiniciar');
  if(botao.classList.contains('container__botao-desabilitado')){
    botao.classList.remove('container__botao-desabilitado');
    botao.classList.add('container__botao');
  } else {
    botao.classList.remove('container__botao');
    botao.classList.add('container__botao-desabilitado');
  }
}

function reiniciar(){
  let botao = document.getElementById('btn-reiniciar');
  botao.classList.remove('container__botao');
  botao.classList.add('container__botao-desabilitado');

  exibirHTMLNaTela('#resultado', `<label class="texto__paragrafo">Números sorteados:  nenhum até agora</label>`);
  document.getElementById('quantidade').value = 5;
  document.getElementById('de').value = 1;
  document.getElementById('ate').value = 10;
  listaNumerosSorteados = [];
}

function obterNumeroAleatorio(min, max){
  return parseInt((Math.random() * (max - min + 1)) + min);
}

function sortear(){
  listaNumerosSorteados = [];
  pegaValoresDigitados();
  if(quantidadeDeNumeros > (ateNumero - doNumero + 1)){
    exibirHTMLNaTela('#resultado', `<label class="texto__paragrafo">A quantidede de números não pode ser maior do que o intervalo do número ${doNumero} até ${ateNumero}.</label>`);
  } else {
    while(listaNumerosSorteados.length < quantidadeDeNumeros){
      let numeroAleatorio = obterNumeroAleatorio(doNumero, ateNumero);
      if(!listaNumerosSorteados.includes(numeroAleatorio)){
        listaNumerosSorteados.push(numeroAleatorio);
      }
    }
    console.log(`Números sorteados ${listaNumerosSorteados}`);
    exibirHTMLNaTela('#resultado', `<label class="texto__paragrafo">Números de ${doNumero} ate ${ateNumero} sorteados ${listaNumerosSorteados}</label>`);
    
    let botao = document.getElementById('btn-reiniciar');
    botao.classList.remove('container__botao-desabilitado');
    botao.classList.add('container__botao');
  }
}

Meus amigos, baseado no código da aula e no código por vocês compartilhados, eu tentei desenvolver a aplicação do meu jeito e até consegui resolver alguns problemas como os do botão reiniciar, porém, esbarrei em 2 problema:

1 - Não consegui escrever uma verificação se a quantidade de números informados está dentro ou fora do range inicial e final. Eu não soube posicionar o trecho de código dentro do código principal e então quando eu preencho os campos e clico no sortear não acontece nada, eu não consigo clicar novamente em sortear e os campos travam e não consigo editar e ao atualizar a página, parece q entra em algum loop infinito e preciso fechar no navegador.

2 - O segundo problema talvez seja uma opinião pessoal minha, ao realizar o sorteio acho que deveria travar o botão e não realizar outro sorteio, deveria ter a mesma função do botão reiniciar, porém também não consegui posicionar o trecho de código.

Portanto, baseado no meu código, como eu poderia resolver esses 2 problemas?

Obrigado

Insira aqui a descrição dessa imagem para ajudar na acessibilidade