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

Ajuda

Olá, tudo bem?!

É o seguinte, quero que ele só fique em vermelho o imc quando der algum resultado inválido.Até esse ponto eu consegui.

O problema que está ocorrendo é que quando da algum valor incorreto ele só põe de vermelho o primeiro imc.

o código do instrutor é o seguinte:

var pacientes = document.querySelectorAll(".paciente");

for (var i = 0; i < pacientes.length; i++) {
  var paciente = pacientes[i];

  var tdPeso = paciente.querySelector(".info-peso");
  var peso =  tdPeso.textContent;

  var tdAltura = paciente.querySelector(".info-altura");
  var altura = tdAltura.textContent;

  var tdImc = paciente.querySelector(".info-imc");

  var alturaEValida = true;
  var pesoEValido = true;

  if (peso <= 0 || peso > 1000) {
    tdImc.textContent = "Peso inválido!"
    pesoEValido = false;
    paciente.classList.add("paciente-invalido");
  }

  if (altura <= 0 || altura > 1000) {
      tdImc.textContent = "Altura inválida!";
      alturaEValida = false;
      paciente.classList.add("paciente-invalido");
  }

  if (pesoEValido && alturaEValida) {
    var imc = peso / (altura * altura);
    tdImc.textContent = imc.toFixed(1);

  }
}

Ao fazer esse código se algum peso, ou altura não estiver nos conformes, seleciona toda a linha, nome, peso, atura,etc. E à pinta de vermelho.

sabendo disso fiz mais específico, criei meu código assim:

var pacientes = document.querySelectorAll(".paciente");
var invalido = document.querySelector(".info-imc");

for (var i = 0; i < pacientes.length; i++) {
  var paciente = pacientes[i];

  var tdPeso = paciente.querySelector(".info-peso");
  var peso =  tdPeso.textContent;

  var tdAltura = paciente.querySelector(".info-altura");
  var altura = tdAltura.textContent;

  var tdImc = paciente.querySelector(".info-imc");

  var alturaEValida = true;
  var pesoEValido = true;

  if (peso <= 0 || peso > 1000) {
    tdImc.textContent = "Peso inválido!"
    pesoEValido = false;
    invalido.classList.add("paciente-invalido");
  }

  if (altura <= 0 || altura > 1000) {
      tdImc.textContent = "Altura inválida!";
      alturaEValida = false;
      invalido.classList.add("paciente-invalido");
  }

  if (pesoEValido && alturaEValida) {
    var imc = peso / (altura * altura);
    tdImc.textContent = imc.toFixed(1);

  }
}

com esse código acima, só coloca de vermelho o primeiro Imc, independente se é a altura ou o peso errado, ou ainda se é o ultimo paciente ao invés do primeiro.

Pensei em fazer um for para ele ir de paciente em paciente conferindo, não deu certo. Pelo menos o método que tentei.

Poderiam me ajudar?

4 respostas

Verificação Altura > 1000 , o valor correto seria 3 ou 4 metros...

Outro ponto é o CSS, como esta a configuração? e o Html?

Botarei só a parte da tabela do Html

<tbody id="tabela-pacientes">
<tr class="paciente">
<td class="info-nome">Paulo</td>
<td class="info-peso">100</td>
<td class="info-altura">2.00</td>
<td class="info-gordura">10</td>
<td class="info-imc" >0</td>
</tr>

<tr class="paciente" >
<td class="info-nome">João</td>
<td class="info-peso">80</td>
<td class="info-altura">0</td>
<td class="info-gordura">40</td>
<td class="info-imc">0</td>
</tr>

<tr class="paciente" >
<td class="info-nome">Erica</td>
<td class="info-peso">54</td>
<td class="info-altura">1.64</td>
<td class="info-gordura">14</td>
<td class="info-imc">0</td>
</tr>

<tr class="paciente">
<td class="info-nome">Douglas</td>
<td class="info-peso">85</td>
<td class="info-altura">1.73</td>
<td class="info-gordura">24</td>
<td class="info-imc">0</td>
</tr>
</tbody>
</table>

no CSS botarei só o código inválido:

.paciente-invalido{
    color: red;
}
solução!

O problema está na variável "invalido", você precisa declarar ela dentro da estrutura de repetição "For", como ela está fora, ela somente pega o primeiro campo com a classe, por isso que está aplicando a classe na linha errada.

O código ficaria desta forma:

<script type="text/javascript">
var pacientes = document.querySelectorAll(".paciente");


for (var i = 0; i < pacientes.length; i++) {
  var paciente = pacientes[i];
  var invalido = pacientes[i].querySelector(".info-imc");
  var tdPeso = paciente.querySelector(".info-peso");
  var peso =  tdPeso.textContent;

  var tdAltura = paciente.querySelector(".info-altura");
  var altura = tdAltura.textContent;

  var tdImc = paciente.querySelector(".info-imc");

  var alturaEValida = true;
  var pesoEValido = true;

  if (peso <= 0 || peso > 1000) {
    tdImc.textContent = "Peso inválido!"
    pesoEValido = false;
    console.log('a');
    invalido.classList.add("paciente-invalido");
  }

  if (altura <= 0 || altura > 1000) {
      tdImc.textContent = "Altura inválida!";
      alturaEValida = false;
      console.log('b');
      invalido.classList.add("paciente-invalido");
  }

  if (pesoEValido && alturaEValida) {
    var imc = peso / (altura * altura);
    tdImc.textContent = imc.toFixed(1);
    console.log('c');

  }
}

</script>

Massa!! Estava tentando pensar como à colocaria no for.

Obrigado!