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

Código imprimindo 5 vezes ao invés de 1.

O código está retornando 5 linhas ao invés de uma. Equivale pressionar no botão "Adiciona" 5 vezes, e não adiciona as informações inseridas na página.

Alguém pode ajudar?

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 >600){
        alert("Peso inválido. Insira um peso válido")
        pesoEhValido = false;
        tdPeso.textContent = "Peso Inválido";
        paciente.classList.add("paciente-invalido");
    }
    else if (altura <=0 || altura >2.50){
        alert("Altura inválida. Insira uma altura válida");
        alturaEhValida = false;
        tdAltura.textContent = "Altura inválida";
        paciente.classList.add("paciente-invalido");
    }
    else if (pesoEhValido && alturaEhValida){
        var imc = peso / (altura * altura);
        tdImc.textContent = imc.toFixed(2);
    }
    else{
        alert("Oops, algo deu errado, tente novamente!");
    }

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

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

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

        var pacienteTd = 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");

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

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

    })

}
4 respostas

Fala Rodrigo! Tudo bem?

Meu caro, parece que seu laço 'for', não está sendo fechado no local certo ali. Você precisa fechar ele logo após o último 'else';

Aí têm 2 funções que fazem coisas diferentes. O conteúdo de dentro do 'for' é este:

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 >600){
        alert("Peso inválido. Insira um peso válido")
        pesoEhValido = false;
        tdPeso.textContent = "Peso Inválido";
        paciente.classList.add("paciente-invalido");
    }
    else if (altura <=0 || altura >2.50){
        alert("Altura inválida. Insira uma altura válida");
        alturaEhValida = false;
        tdAltura.textContent = "Altura inválida";
        paciente.classList.add("paciente-invalido");
    }
    else if (pesoEhValido && alturaEhValida){
        var imc = peso / (altura * altura);
        tdImc.textContent = imc.toFixed(2);
    }
    else{
        alert("Oops, algo deu errado, tente novamente!");
    }
}

Feche a chave aí embaixo, como eu fiz, que vai dar certo!

Espero ter ajudado! Bons estudos!

Amigo, essa chave foi fechada mais abaixo no caso seria a ultima, e também a IDE que uso, ela mostra esse erro. Eu mudei aqui os nomes das variáveis que me impediam imprimir os nomes na tela. Porém ainda continua imprimindo 5 vezes. Preciso resolver isso logo para dá andamento as aulas.

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 >600){
        alert("Peso inválido. Insira um peso válido")
        pesoEhValido = false;
        tdPeso.textContent = "Peso Inválido";
        paciente.classList.add("paciente-invalido");
    }
    else if (altura <=0 || altura >2.50){
        alert("Altura inválida. Insira uma altura válida");
        alturaEhValida = false;
        tdAltura.textContent = "Altura inválida";
        paciente.classList.add("paciente-invalido");
    }
    else if (pesoEhValido && alturaEhValida){
        var imc = peso / (altura * altura);
        tdImc.textContent = imc.toFixed(2);
    }
    else{
        alert("Oops, algo deu errado, tente novamente!");
    }


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

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

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

        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;


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

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

}
solução!

Eu vi que você fechou, Rodrigo. Porém o local correto para o fechamento é antes do seu querySelector('#adicionarPaciente'). Quando você coloca seu "escutador" de eventos dentro do laço, ele vai ler aquilo o equivalente ao número de pacientes que você têm. Tenta fazer do modo como te passei ali em cima. Aí me fala o resultado. Se não der certo, nós pensamos em outra solução, ta certo? Vou te ajudar nessa. Me dá um feedback depois

O fechamento em que você estava referindo na minha cabeça seria o fechamento das chaves. E realmente, eu estava escrevendo o código dentro do laço for, e como tinha 5 pacientes, ele executaria cerca de 5 vezes. Para resolver isso o código seria:

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 >600){
        alert("Peso inválido. Insira um peso válido")
        pesoEhValido = false;
        tdPeso.textContent = "Peso Inválido";
        paciente.classList.add("paciente-invalido");
    }
    else if (altura <=0 || altura >2.50){
        alert("Altura inválida. Insira uma altura válida");
        alturaEhValida = false;
        tdAltura.textContent = "Altura inválida";
        paciente.classList.add("paciente-invalido");
    }
    else if (pesoEhValido && alturaEhValida){
        var imc = peso / (altura * altura);
        tdImc.textContent = imc.toFixed(2);
    }
    else{
        alert("Oops, algo deu errado, tente novamente!");
    }

}

    var adicionarPaciente = document.querySelector("#adicionar-paciente");
    adicionarPaciente.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 = imc;

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

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

    tabela.appendChild(pacienteTr);
});