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

Concatenação de strings

Eu estava tentando resolver o exercício proposto na aula, com uma abordagem um pouco diferente. Estava pensando em facilitar o processo, utilizando a concatenação de strings. Cheguei próximo à isto:


function montaTr(paciente) {
  var pacienteTr = document.createElement("tr");
  pacienteTr.classList.add("paciente");

  pacienteTr.appendChild(montaTd(nome));
  pacienteTr.appendChild(montaTd(peso));
  pacienteTr.appendChild(montaTd(altura));
  pacienteTr.appendChild(montaTd(gordura));
  pacienteTr.appendChild(montaTd(imc));

  return pacienteTr;
}

function montaTd(dado) {
  var td = document.createElement("td");
  td.classList.add("info-"+dado);
  td.textContent = paciente.dado;

  return td;
}

Porém possui erros. Gostaria de susgestões.

9 respostas

Boa noite, Felipe! Como vai?

Quais erros que o seu código possui? Descreva-os para que eu possa te ajudar!

Boa noite, Gabriel. O erro indica que a string contém um character inválido:

InvalidCharacterError: String contains an invalid character

na linha:

td.classList.add("info-"+dado);

Eu acho que sei o que está acontecendo. Mas pra ter certeza antes de falar, vc poderia colar aqui o seu código completo pra testar minha hipótese?

Claro, segue o código abaixo:

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

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 montaTr(paciente) {
  var pacienteTr = document.createElement("tr");
  pacienteTr.classList.add("paciente");

  pacienteTr.appendChild(montaTd(nome));
  pacienteTr.appendChild(montaTd(peso));
  pacienteTr.appendChild(montaTd(altura));
  pacienteTr.appendChild(montaTd(gordura));
  pacienteTr.appendChild(montaTd(imc));

  return pacienteTr;
}

function montaTd(dado) {
  var td = document.createElement("td");
  td.classList.add("info-"+dado);
  td.textContent = paciente.dado;

  return td;
}

Vc poderia me mandar o HTML tbm, Felipe?

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

<head>
    <meta charset="UTF-8">
    <title>Aparecida Nutrição</title>
    <link rel="icon" href="favicon.ico" type="image/x-icon">
    <link rel="stylesheet" type="text/css" href="css/reset.css">
    <link rel="stylesheet" type="text/css" href="css/index.css">
</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">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" id="segundo-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" id="terceiro-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" id="quarto-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" id="quinto-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>
    <br>

    <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">
            </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>
    </section>

    <script src="js/calculaImc.js"></script>
    <script src="js/form.js"></script>

</body>

</html>
solução!

Felipe, seu código tem apenas dois problemas!

  1. Repare nas duas linhas a seguir:

    var paciente = obtemPacienteDoFormulario(form);
    var pacienteTr = montaTr(paciente);

    Na primeira vc monta um objeto com as informações vindas do formulário e o chama de paciente. Em seguida vc passa esse paciente para a função montaTr(). Daí, dentro da função montaTr() vc tenta acessar as informações do paciente, mas de maneira incorreta fazendo:

    function montaTr(paciente) {
      var pacienteTr = document.createElement("tr");
      pacienteTr.classList.add("paciente");
    
      pacienteTr.appendChild(montaTd(nome));
      pacienteTr.appendChild(montaTd(peso));
      pacienteTr.appendChild(montaTd(altura));
      pacienteTr.appendChild(montaTd(gordura));
      pacienteTr.appendChild(montaTd(imc));
    
      return pacienteTr;
    }

    Mas, repare que dentro da sua função não existe nenhuma variável nome, peso, altura, gordura e imc! Todas essas informações estão dentro do parâmetropaciente que sua função recebe! Então, o correto seria fazer:

    function montaTr(paciente) {
      var pacienteTr = document.createElement("tr");
      pacienteTr.classList.add("paciente");
    
      pacienteTr.appendChild(montaTd(paciente.nome));
      pacienteTr.appendChild(montaTd(paciente.peso));
      pacienteTr.appendChild(montaTd(paciente.altura));
      pacienteTr.appendChild(montaTd(paciente.gordura));
      pacienteTr.appendChild(montaTd(paciente.imc));
    
      return pacienteTr;
    }
  2. Além disso, na função montaTd() vc faz:

    function montaTd(dado) {
     var td = document.createElement("td");
     td.classList.add("info-" + dado);
     td.textContent = paciente.dado;
    
     return td;
    }

    Mas, repare que paciente não existe dentro da sua função e que a informação que vc quer exibir na td é recebida através do parâmetro dado que sua função recebe! O correto seria:

    function montaTd(dado) {
     var td = document.createElement("td");
     td.classList.add("info-" + dado);
     td.textContent = dado;
    
     return td;
    }

Feitos esses ajustes o seu código irá funcionar!

Grande abraço e bons estudos!

Obrigadão, Gabriel. Era isso mesmo.

Por nada, Felipe!

Sempre que tiver qualquer dúvida é só recorrer ao fórum!

Grande abraço e bons estudos!