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

O paciente fica invisivel, mas não volta!

Pessoal, boa tarde!

O negócio é o seguinte: Seguindo a instrução para filtrar os pacientes da tabela do prof., caso o nome digitado no campo de filtro for diferente do nome do paciente, a tr inteira deve sumir. Caso o nome digitado seja igual, a tr inteira vai aparecer.

O problema é que quando eu começo a digitar um nome, por exemplo "Paulo", todos os nomes somem, mas quando eu digito o nome completo, a tr não está voltando e a tabela fica vazia.

Alguem pode me ajudar?

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

campoFiltro.addEventListener("input", function(){
  console.log(this.value);
  var pacientes = document.querySelectorAll(".paciente");
  pacientes.forEach(function(paciente){
    var tdNome = paciente.querySelector(".info-nome")
    var nome = tdNome.textContent;
    if(nome != this.value){
      paciente.classList.add("invisivel");
    }else{
      paciente.classList.remove("invisivel");
    }
  });
});
---------------------------css-----------------------------
.invisivel{
    display: none;
}
5 respostas

Olá, Kaique.

Não vi nenhum problema no seu filtro. Você está recebendo algum erro no console do seu navegador?

Oi Marco!

Obrigado por ter respondido.

Não recebo nenhum erro no console. Pelo o que eu pesquisei, parece o que o erro está no forEach, enquanto o prof. usou o for normal.

Porém, eu não consigo entender o porquê disso estar acontecendo.

solução!

Kaique. Você tem razão o problema está com o forEach.

Dentro do forEach se você adicionar um consele.log(this) verá que o retorno no console será undefined, isso acaba acontecendo por causa da função anônima . Temos duas forma de resolver:

1 - A mais comum no mercado de trabalho é você criar um variável que referencie o this e em vez de usar o this dentro da função anônima você usará a variável que você criou. Código de exemplo abaixo:

campoFiltro.addEventListener("input", function(){
  console.log(this.value);
  var pacientes = document.querySelectorAll(".paciente");
  var $this = this;
  pacientes.forEach(function(paciente){
    var tdNome = paciente.querySelector(".info-nome")
    var nome = tdNome.textContent;
    if(nome != $this.value){
      paciente.classList.add("invisivel");
    }else{
      paciente.classList.remove("invisivel");
    }
  });
});

2 - A outra forma é usar no lugar da função anônima uma arrow function. Tome cuidado que o suporte da arrow function nós navegadores não é tão boa por enquanto, você pode ver como esta esse suporte no site http://caniuse.com. Código de exemplo abaixo:

campoFiltro.addEventListener("input", function(){
  console.log(this.value);
  var pacientes = document.querySelectorAll(".paciente");
  pacientes.forEach((paciente) => {
    var tdNome = paciente.querySelector(".info-nome")
    var nome = tdNome.textContent;
    if(nome != this.value){
      paciente.classList.add("invisivel");
    }else{
      paciente.classList.remove("invisivel");
    }
  });
});

Marco,

Muito obrigado pela atenção e ajuda!

Abs.

Por nada, Kaique.

Se aparecer mais dúvidas, por favor não deixe de postar :-)