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

IMC de novo paciente retorna o valor NAN

Refiz o código conforme as explicações do instrutor, alterando apenas imcTd por em tdImc em calcula-imc.js. Depois de atualizar o navegador e inserir um novo paciente, o IMC do novo paciente retorna o valor NAN sem apresentar erros no console. Há algum erro que não percebi? Obrigada pela atenção.

<!DOCTYPE html>

// Restante do Código HTML, apenas para mostrar que os arquivos Java Script foram declarados

        <script src="js/calcula-imc.js" ></script>
        <script src="js/form.js"></script>

    </body>
</html>

// calcula-imc.js

var titulo = document.querySelector(".titulo");
titulo.textContent = "Aparecida Nutricionista";

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 pesoEhValido = true;
    var alturaEhValida = true;

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

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

    if (pesoEhValido && alturaEhValida) {
      var imc = calculaImc(peso, altura);
      tdImc.textContent = imc;
    }

}

function calculaImc(peso, altura){
    var imc = 0;
    imc = peso / (altura * altura);
    return imc.toFixed(2);
}

// form.js

var botaoAdicionar = document.querySelector("#adicionar-paciente");
botaoAdicionar.addEventListener("click", function(event) {
    event.preventDefault();

    var form = document.querySelector("#form-adiciona");

    var nome = form.nome.value;
    var peso = form.peso.value;
    var altura = form.altura.value;
    var gordura = form.gordura.value;

    var pacienteTr = document.createElement("tr");

    var nomeTd = document.createElement("td");
    var pesoTd = document.createElement("td");
    var alturaTd = document.createElement("td");
    var gorduraTd = document.createElement("td");
    var imcTd = document.createElement("td");

    nomeTd.textContent = nome;
    pesoTd.textContent = peso;
    alturaTd.textContent = altura;
    gorduraTd.textContent = gordura;
    imcTd.textContent = calculaImc(peso,altura);

    pacienteTr.appendChild(nomeTd);
    pacienteTr.appendChild(pesoTd);
    pacienteTr.appendChild(alturaTd);
    pacienteTr.appendChild(gorduraTd);
    pacienteTr.appendChild(imcTd);

    var tabela = document.querySelector("#tabela-pacientes");

    tabela.appendChild(pacienteTr);

});
2 respostas
solução!

Jaqueline, bom dia!

Este erro geralmente acontece por que o javascript está processando um texto e tentando fazer um cálculo com ele. Por exemplo: não dá pra somar G + 32, em javascript, isso não é possível neste contexto.

O javascript trabalha com um evento chamado coerção de formatos. Ou seja, quando ele faz uma comparação ou uma operação matemática, ele tenta converter os dois elementos variáveis para te entregar um resultado. Acontece que nem sempre a coerção acontece do jeito que a gente espera.

Sendo assim, é possível que você consiga o resultado que espera garantindo que receba um número no input do usuário como eu te mostro abaixo.

var peso = parseFloat(tdPeso.textContent).toFixed(2);
var altura = parseFloat(tdAltura.textContent).toFixed(2);

Essa alteração na forma como você está recebendo as variáveis garante que você está recebendo apenas números nelas.

O parseFloat() vai transforma em número preservando os decimais e o toFixed(2) vai garantir que não tenhamos muitas casas decimais limitando elas

Você pode upar o código pro Github pra gente testar se não estiver conseguindo mesmo assim

Espero ter ajudado!

Boa noite, Allan.

Obrigada pela ajuda e pelas explicações. Fiz as alterações sugeridas por você e continua o mesmo problema. Aparece o resultado NAN no IMC do novo paciente inserido no Formulário.

Vou continuar fazendo as demais aulas e verificando os próximos gabaritos para ver se identifico o erro.

Atenciosamente,

Jaqueline Viegas