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

Erro [object HTMLInputElement] Como resolver?

Consigo adicionar novos pacientes normalmente, porém um ficou travado como " [object HTMLInputElement]" em seu nome e gordura corporal. Percorri o código e não achei a fonte do problema.

Código HTML

<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <title>Correa Nutricionista</title>
    <link rel="icon" href="favicon.ico" type="image/x-icon">
    <!-- adiciona ícone ao lado do nome do site. -->
    <link rel="stylesheet" type="text/css" href="css/reset.css">
        <!-- Reseta todas as configurações de estilo padrões -->
    <link rel="stylesheet" type="text/css" href="css/index.css">
        <!-- Aponta para a folha de estilo css -->
</head>

<body>

    <header>
        <div class="container">
            <h1 class="titulo">Corrêa Nutricionista</h1>
        </div>
    </header>
        <!-- Cabeçalho que contém o título-->

    <main>
        <section class="container">
            <h2>Pacientes de 2020 &#9760;</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">Correa</td>
                        <td class="info-peso">67</td>
                        <td class="info-altura">1.71</td>
                        <td class="info-gordura">12</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="Nome do paciente" class="campo">
            </div> <!-- --> <!-- Formulário de NOME -->
            <div class="grupo">
                <label for="peso">Peso:</label>
                <input id="peso" name="peso" type="text" placeholder="Peso do paciente" class="campo campo-medio">
            </div> <!-- Formulário de peso --> <!-- Formulário de PESO -->
            <div class="grupo">
                <label for="altura">Altura:</label>
                <input id="altura" name="altura" type="text" placeholder="Altura do paciente" class="campo campo-medio">
            </div> <!-- Formulário de ALTURA -->
            <div class="grupo">
                <label for="gordura">% de Gordura:</label>
                <input id="gordura" name="gordura" type="text" placeholder="Porcentagem de gordura do paciente" class="campo campo-medio">
            </div> <!-- Formulário de PORCENTAGEM DE GORDURA -->

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

    <!-- Importação dos Javascripts AQUI -->
    <script src="js/calcula-imc.js"></script>
    <script src="js/form.js"></script>

</body>
3 respostas

Código "calcula-imc.js"

console.log("Fui carregado de um arquivo externo");

var titulo = document.querySelector(".titulo"); //Armazena a classe .titulo na variável titulo

titulo.textContent = "Correa Nutricionista"; //O conteúdo do título é "Correa Nutricionista"

var pacientes = document.querySelectorAll(".paciente"); //Armazena todas as TRs com a classe ".ciente" na variável pacientes

for (var i = 0; i < pacientes.length; i++) { // variável i é o contador que começa em 0. i deve funcionar até (o tamanho de trs da classe)
    var paciente = pacientes[i]; // navega 1 por 1
    var tdPeso = paciente.querySelector(".info-peso"); //armazena o conteúdo que está dentro da classe .info-peso na variável tdPeso
    var tdAltura = paciente.querySelector(".info-altura"); //armazena o conteúdo que está dentro da classe .info-altura na variável tdAltura

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

    var peso = tdPeso.textContent; // variável peso recebe o conteúdo que está dentro da variável tdPeso
    var altura = tdAltura.textContent; // variável altura recebe o conteúdo que está dentro da variável tdAltura

    var alturaEhValida = true; // define como verdadeiro (de boa fé)
    var pesoEhValido = true; // define como verdadeiro (de boa fé)

    if (peso <= 0 || peso > 500) { // Se o peso for igual ou menor que zero ou maior que 500 faça
        console.log("Peso inválido");
        tdImc.textContent = "Peso inválido!"
        pesoEhValido = false;

        paciente.classList.add("paciente-invalido");
    }

    if (altura <= 0 || altura >= 3) { // Se altura for menor ou igual a zero ou mais ou igual a 3 faça
        console.log("Altura inválida");
        tdImc.textContent = "Altura inválida!";
        alturaEhValida = false;

        paciente.classList.add("paciente-invalido");
    }

    if (pesoEhValido && alturaEhValida) { // Se peso e altura forem válidos, faça
        var imc = calculaImc(peso, altura);
        imcTd.textContent = imc;
    }
}

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

Código "form.js"

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

    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();

});

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);

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;
}

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 as adiciona dentro das TR's
    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;
}
solução!

Olá Lucas, tudo bem com você?

Isso aconteceu porque em seu código você esta inserindo um paciente antes mesmo de preencher o formulário, veja:

>>> js/form.js

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);

Quando a pagina carrega você já começa a capturar elementos e colocar o textContent que tem valores inválidos, por exemplo:

O valor nome que você tenta atribuir ao nomeTd.textContent não existe em nosso arquivo form.js e na verdade nome é uma variável global que representa o <input id="nome"/> por isso ele te mostra um object HTMLInputElement, porque de fato é um elemento html e não o valor do formulário :)

Como você já tem todas as funções criadas, você pode tranquilamente deletar esse código que não haverá problema nenhum, e ai quando a pessoa pedir para inserir irá funcionar normalmente e terá todos os dados validos :)

Abraços e Bons Estudos!