Alerts the user that he did not choose a type=radio;

Asked

Viewed 58 times

1

I’m having a problem not knowing how to identify if the user has selected an option type=radio.

Follows the code:

let nComputador = "";
let nJogador = "";
//let minhaEscolha = document.querySelector("input[type='radio']:checked").value;

function sortear(max) {
  return Math.floor(Math.random() * max);
};

let play = document.getElementById("jogar").addEventListener('click', function() {

  let minhaEscolha = document.querySelector("input[type='radio']:checked").value;

  if (minhaEscolha === null) {
    return alert("escolha uma opção!")
  }

  nJogador = parseFloat(document.querySelector("#meuNumero").value);

  nComputador = sortear(10);

  if (isNaN(nJogador)) {
    return alert("digite um numero");
  }

  let soma = ((nJogador + nComputador) % 2 === 0) ? "par" : "impar";
  let resultado = (soma == minhaEscolha) ? alert("ganhei") : alert("computador ganhou");

  console.log(nComputador, nJogador, minhaEscolha, soma);
});
<body>

  <h1>
    jogo do par ou impar
  </h1>
  <p>
    Digite um número de 0 a 10:
    <input type="number" id="meuNumero" min="0" max="10">
    <label><input type="radio" name="escolha" value="par">Par</label>
    <label><input type="radio" name="escolha" value="impar">Impar</label>
  </p>
  <button id="jogar">Jogar</button>
</body>

That one if shouldn’t work?

if (minhaEscolha === null) {
    return alert("escolha uma opção!")
}

1 answer

0


The problem is before the if (minhaEscolha === null), in this passage:

document.querySelector("input[type='radio']:checked").value

You’re looking for a radio marked (checked). But if none is marked, the querySelector finds nothing and returns null. And trying to catch the value of null, makes a mistake.

A solution is first to check whether the querySelector returned something, and only then catch the value:

let nComputador = "";
let nJogador = "";

function sortear(max) {
  return Math.floor(Math.random() * max);
};

let play = document.getElementById("jogar").addEventListener('click', function() {

  // verificar se algum radio foi marcado (não pega o value ainda)
  let minhaEscolha = document.querySelector("input[type='radio']:checked");

  if (!minhaEscolha) { // se nenhum radio foi marcado
    return alert("escolha uma opção!");
  }

  // pegar o valor do radio marcado
  minhaEscolha = minhaEscolha.value;

  nJogador = parseFloat(document.querySelector("#meuNumero").value);

  nComputador = sortear(10);

  if (isNaN(nJogador)) {
    return alert("digite um numero");
  }

  let soma = ((nJogador + nComputador) % 2 === 0) ? "par" : "impar";
  let resultado = (soma == minhaEscolha) ? alert("ganhei") : alert("computador ganhou");

  console.log(nComputador, nJogador, minhaEscolha, soma);
});
<body>

  <h1>
    jogo do par ou impar
  </h1>
  <p>
    Digite um número de 0 a 10:
    <input type="number" id="meuNumero" min="0" max="10">
    <label><input type="radio" name="escolha" value="par">Par</label>
    <label><input type="radio" name="escolha" value="impar">Impar</label>
  </p>
  <button id="jogar">Jogar</button>
</body>

You can also choose to use parseInt instead of parseFloat, since an even or odd game - as far as I know - only uses whole numbers.

  • I got it, I checked the code I had done looked like it, but right after if(!myChoose) I had put an Else to get value, this interferes?

  • @Patrickeidrian As inside the if (!minhaEscolha) has a return, if you enter the if it leaves the function, then the else in this case it makes no difference. see here: https://ideone.com/84lyHS

  • I didn’t know that part of return, and on the parseFloat I usually put because the user knows, I don’t know what he can try. thank you

  • @Patrickeidrian parseInt("2.5") will round to 2, then you decide what’s best in your case, accept 2.5 (that will never be equal, for the rest of the division is 0.5), or round automatically with parseInt.

  • 1

    is really better the parseInt, another valuable tip (y)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.