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

Olá, gostaria de poder entender o por que meu filtro não funciona / Repostagem

Poderiam me ajudar por favor, não sei pq o filtro não funciona quando add os pacientes da api.

Arquivo js Buscar paciente

var buscarPaciente = document.querySelector("#buscar-paciente");

buscarPaciente.addEventListener("click", function(){

    var xhr = new XMLHttpRequest();

    xhr.open("GET","https://api-pacientes.herokuapp.com/pacientes" );

    xhr.addEventListener("load", function(){

        var erroAjax = document.querySelector("#erro-ajax");

        if(xhr.status == 200){

            var pacientes = JSON.parse(xhr.responseText); 

            erroAjax.classList.add("invisivel");

            pacientes.forEach(function(paciente){

                adicionarPacientes(paciente);
            });

        }else{

            erroAjax.classList.remove("invisivel");

        }
     });

    xhr.send();

});

Arquivo js Filtragem

var buscarPaciente = document.querySelector("#buscar-paciente");

buscarPaciente.addEventListener("click", function(){

    var xhr = new XMLHttpRequest();

    xhr.open("GET","https://api-pacientes.herokuapp.com/pacientes" );

    xhr.addEventListener("load", function(){

        var erroAjax = document.querySelector("#erro-ajax");

        if(xhr.status == 200){

            var pacientes = JSON.parse(xhr.responseText); 

            erroAjax.classList.add("invisivel");

            pacientes.forEach(function(paciente){

                adicionarPacientes(paciente);
            });

        }else{

            erroAjax.classList.remove("invisivel");

        }
     });

    xhr.send();

});

Arquivo index HTML

<!DOCTYPE html>

<html lang = "pt-br">

    <head>

        <meta charset = "UTF-8">
        <meta name = "viewport" content = "width = device-width">
        <title> Calcule o seu Indice de Massa Corporal</title>

        <link rel ="stylesheet" href = "css/reset.css">
        <link rel = "stylesheet" href = "css/style_imc.css">
    </head>

    <body>

        <header>

            <div class = "titulo"> <h1 > Saúde  </h1 > </div>

        </header>

        <main>

            <section class="container">

                <div class = "titulo-tabela">

                    <h2> Tabela do seu Indice de massa corporal e da sua família. </h2>
                </div>



                <label for="filtro-tabela" class="titulo-filtro">Buscar:</label>
                <input type="text" name="filtro" id="filtro-tabela" placeholder="Digite o nome do paciente">


                <div>

                    <table class="tabela">

                        <thead>

                            <tr>
                                <th> Nome </th>
                                <th>Altura</th>
                                <th>Peso(kg)</th>
                                <th> IMC</th>

                            </tr>
                        </thead>

                        <tbody id = "tabela-corpo">

                            <tr class = "paciente">
                                <td class = "nome">joão</td>
                                <td class = "altura">1.70</td>
                                <td class = "peso"> 90 </td>
                                <td class = "info_imc"></td>
                            </tr>

                            <tr class = "paciente">
                                <td class = "nome">joão</td>
                                <td class = "altura">2.70</td>
                                <td class = "peso"> 100 </td>
                                <td class = "info_imc"></td>
                            </tr>

                            <tr class = "paciente">
                                <td class = "nome">Ana lucia</td>
                                <td class = "altura">1.80</td>
                                <td class = "peso"> 80 </td>
                                <td class = "info_imc"></td>
                            </tr>

                            <tr class = "paciente">
                                <td class = "nome">Claudio</td>
                                <td class = "altura">1.70</td>
                                <td class = "peso"> 90 </td>
                                <td class = "info_imc"></td>
                            </tr>

                        </tbody>
                    </table>
                </div>
            </section>

            <span id="erro-ajax" class="invisivel">Ocorreu um erro em sua requisição</span>

            <button id="buscar-paciente" class="buscar-paciente" > Buscar Pacientes</button>





            <nav class = "form">

                <form id = "formulario-tabela">

                    <ul id="mensagem-erro">

                        <li></li>
                    </ul>

                    <legend class = "item-tabela"> Insira as informações do paciente:</legend> 

                    <label for = "nome"> Nome: </label>
                    <input type = "text" name = " nome "  id = "nome" class = "item-tabela" placeholder=" Nome e Sobrenome " >

                    <label for = "altura"> Altura:</label>
                    <input type = "text" name = "altura" id = "altura" class = "item-tabela"  placeholder= " Altura do paciente " >

                    <label for = "peso">Peso:</label>
                    <input type = "text" name = "peso" id = "peso" class = "item-tabela" placeholder=" Peso do paciente">

                    <input type = "submit" value = "Enviar formulário" class = "botao-enviar">
                </form>
            </nav>        
        </main>


        <script src = "js/calcular.js"></script>

        <script src="js/formulario.js"></script>

        <script src = "js/remover-paciente.js"></script>

        <script src = "js/filtragem.js"></script>

        <script src = "js/buscar-pacientes.js"></script>

    </body>


</html>
5 respostas

Fala Saulo, tudo bem?

Olha só.. rodei o código que vc disponibilizou no fórum e no console.log obtive o seguinte erro: ReferenceError: adicionarPacientes is not defined.

Além do erro, o console me mostrou a linha que estava parando o código... fui lá e percebi que a função adicionarPacientes não estava implementada e ainda havia uma chamada errada para o método forEach.

O forEach estava assim:

pacientes.forEach(function (paciente) {
    adicionarPacientes(paciente);
});

A forma correta é:

pacientes.forEach((paciente) => adicionarPacientes(paciente));

Fiz a implementação da função que irá construir a tabela, dinamicamente, e ajustei o forEach. Com isso o botão para importar o JSON de pacientes fuincionou.

A função ficou assim:

function adicionarPacientes(paciente) {
  const tabela = document.querySelector("#tabela-corpo");
  const trElement = document.createElement("tr");
  trElement.classList.add("paciente");

  const nome = document.createElement("td");
  nome.innerHTML = paciente.nome;
  nome.classList.add("nome");
  trElement.appendChild(nome);

  const altura = document.createElement("td");
  altura.innerHTML = paciente.altura;
  altura.classList.add("altura");
  trElement.appendChild(altura);

  const peso = document.createElement("td");
  peso.innerHTML = paciente.peso;
  peso.classList.add("peso");
  trElement.appendChild(peso);

  const imc = document.createElement("td");
  imc.innerHTML = paciente.imc;
  imc.classList.add("info_imc");
  trElement.appendChild(imc);

  tabela.appendChild(trElement);
}

Subi a duvida e solução no meu github.. se quiser pode dar uma olhada aqui: https://github.com/eraldosiniciof/forum-alura/commit/40404dd19d094aedc4f014f55907f437f1c9a1aa

Espero ter ajudado, abraço!

Olá Eraldo, agradeço muito pela ajuda mas ainda não está funcionando :/ eu alterei mas continua o mesmo problema. Eu já havia realizado a criação desse código em outro arquivo do formulário, acabei não postando aqui erro meu, perdão.

Esse é o arquivo do formulário:



var pacientes = document.querySelector(".paciente");


var botao = document.querySelector(".botao-enviar");


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

        event.preventDefault();

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


        var paciente = obtemPacienteDoFormulario(form);


        var erros = validaPaciente(paciente);

        if (erros.length> 0){

               exibeMensagemDeErro(erros);
            return;
        }

        adicionarPacientes(paciente);

        form.reset();

        var mensagemErro = document.querySelector("#mensagem-erro")
        mensagemErro.innerHTML="";
    });


function exibeMensagemDeErro(erros){

    var ul = document.querySelector("#mensagem-erro");

        ul . innerHTML="";

    erros.forEach(function(erro) {

        var li = document.createElement("li");
        li.textContent = erro;
        ul.appendChild(li);

    });



}

function obtemPacienteDoFormulario(form) {

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

    return paciente;
}

function criarTd(dado, classe){


    var criarTd = document.createElement("td");
        criarTd.textContent = dado;
        criarTd.classList.add ("classe");

    return criarTd;
}

function criarTr(paciente){

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

        pacienteTr.appendChild(criarTd(paciente.nome, "nome"));
        pacienteTr.appendChild(criarTd(paciente.altura, "altura"));
        pacienteTr.appendChild(criarTd(paciente.peso, "peso"));
        pacienteTr.appendChild(criarTd(paciente.imc, "info_imc"));

    return pacienteTr;
}

function adicionarPacientes(paciente){

    var dadosDoPaciente = criarTr(paciente);

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

        tabela.appendChild(dadosDoPaciente);

}


function validaPaciente(paciente){

    var mensagemDeErros = [];

    if(paciente.nome.length == 0 && paciente.peso.length == 0 && paciente.altura.length == 0){

        mensagemDeErros.push("Por favor, insira as informações do paciente.");

        return mensagemDeErros;
    }


    if(!pesoEhValido(paciente.peso)){

        mensagemDeErros.push("Peso é inválido ");

    }

    if(!alturaEhValida(paciente.altura)){

        mensagemDeErros.push(" Altura é inválida");
    }

    if(paciente.nome.length == 0 ){

        mensagemDeErros.push("Nome em branco.")
    }

    if(paciente.peso.length == 0 ){

        mensagemDeErros.push("Peso em branco.")
    }

    if(paciente.altura.length == 0){

        mensagemDeErros.push("Altura em branco.")
    }

    return mensagemDeErros;
}

E quando eu vou no console.log, ainda com a alteração do forEach que você me indicou, aparece o mesmo problema que é esse aqui

Apresenta um erro no console que "Uncaught TypeErros: Cannot Reado properties of null - reading, entre aspas, textContent

Esse erro ocorre no arquivo filtragem que sem querer acabei repetindo o código buscar-pacientes

Esse é o arquivo JS certo do filtragem



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

filtro.addEventListener("input", function(){

    var pacientes = document.querySelectorAll(".paciente"); 

    if( this.value.length > 0 ){

        for(var i = 0 ; i < pacientes.length; i++){

            var paciente = pacientes[i];

            var nomeTd = paciente.querySelector(".nome");

            var nome = nomeTd.textContent;  // o erro ocorre aqui 

            var expressao = new RegExp(this.value, "i");

           if(!expressao.test(nome)){

                paciente.classList.add("invisivel");

           }else{

                paciente.classList.remove("invisivel");
           }

        } 

    }else {

        for (var i = 0; i < pacientes.length; i++) {

            var paciente = pacientes[i];

            paciente.classList.remove("invisivel");

        }
    }
});

Fala Saulo... tudo certo?

Você consegue subir o projeto completo no github?

Seria mais facil de te ajudar dessa forma pois clonaria teu repositório aqui para realizar os testes.

Abraço!

Claro aqui está o projeto completo https://github.com/vitor-matheus1999/Site-imc---Aulas-sobre-JavaScript

Agradeço muito a ajuda, estou tentando resolver esse problema a um longo tempo.

solução!

Saulo, vou fechar este tópico. Respondido aqui.

Bons estudos!