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

Não calcula IMC e cria uma linha aleatória antes de tudo

Quando insiro um novo dado a tabela preenche faltando a informação do imc. Antes de inserir a tabela já vem com uma linha vazia. Não consigo identificar o porque destes erros.

var botaoAdicionar = document.querySelector("#adicionar-paciente")

    botaoAdicionar.addEventListener("click", function(){
        event.preventDefault();
        console.log("fui clicado");

        var pacientes = document.querySelectorAll(".paciente");
        var form = document.querySelector("#form-adiciona") 
        var paciente = obtemPacienteDoFormulario(form)

        var pacienteTr = montaTr(paciente);

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

        tabela.appendChild(pacienteTr);

        form.reset();
    });
function obtemPacienteDoFormulario(form){
         var paciente = {
                nome: form.nome.value,
                peso: form.peso.value,
                altura: form.altura.value,
                gordura: form.gordura.value

         }
         return paciente //retorna a variável paciente

}

function montaTd(dado, classe) {
        var td = document.createElement("td");
        td.classList.add(classe);
        td.textContent = dado;

        return td;
    }

    function montaTr(paciente) {
        //Cria TR
        var pacienteTr = document.createElement("tr");
        pacienteTr.classList.add("paciente");
        //Cria as TD's e a adiciona dentro da TR
        pacienteTr.appendChild(montaTd(paciente.nome, "info-nome"));
        pacienteTr.appendChild(montaTd(paciente.peso, "info-peso"));
        pacienteTr.appendChild(montaTd(paciente.altura, "info-altura"));
        pacienteTr.appendChild(montaTd(paciente.gordura, "info-gordura"));
        pacienteTr.appendChild(montaTd(paciente.imc, "info-imc"));
        // retorna a TR
        return pacienteTr;  
    }


        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.createComment("td")

        nomeTd.textContent = paciente.nome;
        pesoTd.textContent = paciente.peso;
        alturaTd.textContent = paciente.altura;
        gorduraTd.textContent = paciente.gordura;
        imcTd.textContent = paciente.imc; 



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

        var tabela = document.querySelector("#tabela-pacientes")
         tabela.appendChild(pacienteTr)        
6 respostas

Boa tarde, Lucas! Como vai?

Assim que vc abre a página no navegador é exibido alguma mensagem de erro no console do navegador? Se sim, qual é a mensagem? Além disso, também é necessário saber se alguma mensagem de erro é apresentada no mesmo console do navegador quando vc tenta cadastrar um novo paciente!

Manda essas informações aqui que eu tento te ajudar a descobrir o problema!

Oi Lucas tudo bem? O problema do código é que faltava vários ponto e vírgula no final das linhas, e no javascript é essencial colocar ponto e vírgula.

Como o professor Gabriel explicou a mensagem de erro no navegador é muito importante para acharmos a linha que esquecemos o ponto e vírgula (eu costumo esquecer e olha que trabalho com isso rsrsr).

Não sei se você tinha o HTML mas eu acabei criando um. Veja o código completo abaixo.

<!DOCTYPE html>
<html>
<body>
<form id="form-adiciona">

    <input name="nome" placeholder="Digite o nome do paciente">
    <input name="peso" placeholder="Digite o peso do paciente">
    <input name="altura" placeholder="Digite a altura do paciente">
    <input name="gordura" placeholder="Digite a gordura do paciente">

</form>
<br>
<button id="adicionar-paciente">Adicionar Paciente</button>
<br>
<table id="tabela-pacientes">
    <tr>
        <th>Nome</th>
        <th>Peso</th>
        <th>Altura</th>
        <th>Gordura</th>
    </tr>
</table>
<script>
var botaoAdicionar = document.querySelector("#adicionar-paciente");

    botaoAdicionar.addEventListener("click", function(){
        event.preventDefault();
        console.log("fui clicado");

        var pacientes = document.querySelectorAll(".paciente");
        var form = document.querySelector("#form-adiciona") ;
        var paciente = obtemPacienteDoFormulario(form);

        var pacienteTr = montaTr(paciente);

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

        tabela.appendChild(pacienteTr);

        form.reset();
    });
function obtemPacienteDoFormulario(form){
         var paciente = {
                nome: form.nome.value,
                peso: form.peso.value,
                altura: form.altura.value,
                gordura: form.gordura.value

         }
         return paciente; //retorna a variável paciente

}

function montaTd(dado, classe) {
        var td = document.createElement("td");
        td.classList.add(classe);
        td.textContent = dado;

        return td;
    }

    function montaTr(paciente) {
        //Cria TR
        var pacienteTr = document.createElement("tr");
        pacienteTr.classList.add("paciente");
        //Cria as TD's e a adiciona dentro da TR
        pacienteTr.appendChild(montaTd(paciente.nome, "info-nome"));
        pacienteTr.appendChild(montaTd(paciente.peso, "info-peso"));
        pacienteTr.appendChild(montaTd(paciente.altura, "info-altura"));
        pacienteTr.appendChild(montaTd(paciente.gordura, "info-gordura"));
        pacienteTr.appendChild(montaTd(paciente.imc, "info-imc"));
        // retorna a TR
        return pacienteTr;  
    }


        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.createComment("td");

        nomeTd.textContent = paciente.nome;
        pesoTd.textContent = paciente.peso;
        alturaTd.textContent = paciente.altura;
        gorduraTd.textContent = paciente.gordura;
        imcTd.textContent = paciente.imc; 



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

        var tabela = document.querySelector("#tabela-pacientes");
         tabela.appendChild(pacienteTr);
</script>
</body>
</html>

Espero que tenha ajudado!!!

Gabriel, André, muito obrigado pela atenção.

Coloquei ponto e virgula no restante do código. No entanto quando acrescento uma nova pessoa continua não calculando e não aparece nenhuma mensagem de erro. Vou encaminhar o html e o código que calcula o imc.


//------------------- cálculo de imc


    var pacientes = document.querySelectorAll(".paciente"); 
    for(var i = 0; i < pacientes.length; i++){ //lenght conta a quantidade de ementos que um array possui

        var paciente = pacientes[i];
        var tdPeso = paciente.querySelector(".info-peso");
    var tdAltura = paciente.querySelector(".info-altura");

    var peso = tdPeso.textContent ;
    var altura = tdAltura.textContent ;


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


        var pesoehvalido = true;
        var pesoehvalida = true;

    if(peso <=0 || peso >=1000){

        tdImc.textContent = "Peso inválido!";
        pesoehvalido = false;
        paciente.classList.add("paciente-invalido");
    }
    if(altura <=0 || altura >=3){
        console.log("Altura Inválida");
        tdImc.textContent("Altura Inválida");
        pesoehvalida = false;
        paciente.classList.add("paciente-invalido");
    }
    if(pesoehvalida && pesoehvalido){ 
        var imc = calculaImc(peso, altura);
        tdImc.textContent = imc;
    }


    }


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

html

</head>
<body>

    <header>
        <div class="container">
            <h1 class="titulo">Aparecida Nutrição</h1>
        </div>
    </header>
    <main>
        <section class="container">
            <h2>Meus pacientes</h2>
            <table>
                <thead>
                    <tr>
                        <th>Nome</th>
                        <th>Peso(kg)</th>
                        <th>Altura(m)</th>
                        <th>Gordura Corporal(%)</th>
                        <th>IMC</th>
                    </tr>
                </thead>
                <tbody id="tabela-pacientes">
                    <tr class="paciente" id="primeiro-paciente">
                        <td class="info-nome">Paulo</td>
                        <td class="info-peso">1100</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">1.72</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>
                    <tr class="paciente" >
                        <td class="info-nome">Tatiana</td>
                        <td class="info-peso">46</td>
                        <td class="info-altura">1.55</td>
                        <td class="info-gordura">19</td>
                        <td class="info-imc">0</td>
                    </tr>
                </tbody>
            </table>

        </section>
    </main>
    <section class="container">
<h2 id="titulo-form">Adicionar novo paciente</h2>
<form id="form-adiciona">
    <div class="grupo">
        <label for="nome">Nome:</label>
        <input id="nome" name="nome" type="text" placeholder="digite o nome do seu paciente" class="campo"> <!-- O name é de um form que o nosso js usa para extrair o conteudo -->
    </div>
    <div class="grupo">
        <label for="peso">Peso:</label>
        <input id="peso" name="peso" type="text" placeholder="digite o peso do seu paciente" class="campo campo-medio">
    </div>
    <div class="grupo">
        <label for="altura">Altura:</label>
        <input id="altura" name="altura" type="text" placeholder="digite a altura do seu paciente" class="campo campo-medio">
    </div>
    <div class="grupo">
        <label for="gordura">% de Gordura:</label>
        <input id="gordura" name="gordura" type="text" placeholder="digite a porcentagem de gordura do seu paciente" class="campo campo-medio">
    </div>

    <button id="adicionar-paciente" class="botao bto-principal">Adicionar</button>
</form>

    }

Oi Lucas tudo bem ?

Pelo que eu olhei aqui, ficou faltando passar a propriedade imc dentro do seu objeto paciente:

function obtemPacienteDoFormulario(form) {

    var paciente = {
        nome: form.nome.value,
        peso: form.peso.value,
        altura: form.altura.value,
        gordura: form.gordura.value,
        imc: calculaImc(form.peso.value, form.altura.value)
    }

    return paciente;
}

E ficou faltando passar o parâmetro dentro do evento de click:

 botaoAdicionar.addEventListener("click", function( event ){

Felipe, muito obrigado pelo esclarecimento, agora sim já estou conseguindo obter o retorno do meu objeto paciente.

No entanto agora o código não faz a validação do imc, ou seja todo meu bloco de código que verifica as informações de se a altura, peso e gordura são validos não funcionam mais.

solução!

Boa noite, Lucas! Como vai?

Nesse ponto do curso que vc está a validação só é feita no momento do carregamento da página. Quanto a novas inserções não há validação. A validação de novos dados inseridos só é implementada nessa aula. Dá uma olhada lá nessa aula que vc deve conseguir acertar tudo numa boa!

Daí se continuar dando problema, manda um alô aqui passando a situação atual do seu código e o log de erro que aparece no navegador que a gente tenta te ajudar!