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

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

*O filtro funciona quando é com os nomes adicionados pelo formulário ou se eu coloquei direto no HTML, mas esses novos que vem como tipo JSON ele não consegue filtrar *

Arquivo javascript do filtro:

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

            var nome = nomeTd.textContent;

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

        }
    }
});

Arquivo javascript do formulário :

document.querySelector("index_imc.html");

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

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

Arquivo javascript para Buscar pacientes:

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 pacientes = JSON.parse(xhr.responseText); 

        pacientes.forEach(function(paciente){

            adicionarPacientesNaTabela(paciente);
        });


    });

    xhr.send();

});

Desde já agradeço a ajuda :)

3 respostas

Abri seu console no navegador verificar seu está dando erro. no arquivo formulário remove essa linha pode ser isso l. document.querySelector("index_imc.html")

Eu abri aqui no console mas acaba que ele não tá reconhecendo o textContent da var nome

Imagem de erro no console, está escrito "Uncaught TypeError: Cannot read properties of null /reading 'textContent' / at HTMLInputElement. <anonymous> /nome do arquivo" Ainda não entendi o por que disso estar acontecendo, chequei todas as tags para ver se estava com algum erro de nome ou feitas erradas mas parece estar tudo normal

Arquivo index.html

`<!DOCTYPE html>
<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">Busca:</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-tabela">joão</td>
                            <td class = "altura-tabela">1.70</td>
                            <td class = "peso-tabela"> 90 </td>
                            <td class = "info_imc"></td>
                        </tr>

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

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

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

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

        <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>
`
solução!

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

Bons estudos!