Como criar uma busca em uma lista HTML com Javascript puro?

Aprenda a fazer um input do tipo texto filtrar apenas os resultados buscados dentro de uma lista comum do HTML.

Como criar uma busca em uma lista HTML com Javascript puro?

Criando a lista no HTML

A lista criada para esse exercício, é no formato mais comum:

<input class="search-fruits" type="text">
<ul class="fruits-list">
  <li>Maçã</li>
  <li>Banana</li>
  <li>Pera</li>
  <li>Uva</li>
  <li>Mamão</li>
  <li>Manga</li>
</ul>

Repare que já colocamos um input do tipo texto para filtrar a nossa lista

Buscando os elementos com Javascript

Vamos buscar os elementos do nosso HTML e salvá-los em variáveis:

let inputElement = document.querySelector("input")
let listElement = document.querySelector("ul")
let itemElement = listElement.querySelectorAll("li")

Aqui, já temos o elemento onde o texto será digitado, a lista de elementos e cada elemento da lista.

Obs.: Nossa última variável está usando o "querySelectorAll", portanto, os elementos estão salvos dentro de um Array.

Criando o disparo do evento

Queremos que a lista seja atualizada toda vez que houver alguma alteração no "input".

Então, podemos usar esse trigger:

inputElement.addEventListener("input", (e) => {
  // Aqui irá executar em toda alteração no input
})

Lógica para busca

Agora que já temos o disparo criado, basta fazermos uma lógica que esconda todos os itens que não condizem com o que está sendo digitado.

Para isso, dentro do evento, vamos criar um loop passando por cada item da lista, assim:

inputElement.addEventListener("input", (e) => {
  itemElement.forEach((li) => {
    // Função executada para cada item da lista
  })
})

Repare que adicionamos o parametro "e" no evento, com esse objeto que pegaremos o que está sendo digitado, dessa forma:

let inputed = e.target.value.toLowerCase()

Nesse momento, já temos o valor digitado e uma função passando pelos elementos da lista.

Agora, temos que verificar se o texto digitado está incluso nos elementos, se sim, mantemos na lista, se não, podemos esconder.

Fica assim:

inputElement.addEventListener("input", (e) => {
  let inputed = e.target.value.toLowerCase()
  itemElement.forEach((li) => {
    let text = li.textContent.toLowerCase()
    if(text.includes(inputed)){
      li.style.display = "block"
    }else{
      li.style.display = "none"
    }
  })
})

Pontos de atenção:

  • Repare que usamos a função "toLowerCase()", tanto no texto digitado, quanto no texto da lista, isso para não termos problemas na comparação de letras minúsculas e maiúsculas.
  • Usamos a função "includes" para verificar se o texto digitado está incluso no texto de cada item da lista.
  • Então, usamos um if/else, para mostrar ou esconder os elementos, utilizando "element.style.display".

Resultado Final

Aqui, aplicamos um pouco de CSS para melhor visualização: