Blog Tinux Net
Publicado en
Web

Autocompletar un input con Javascript Vanilla

Autor

Autocompletado Input

Un sencillo input para un formulario.

input.html:

La clase del div es para poner los colores del background , la posicion general del div y su tipo de letra,

Los estilos style.css:

body {
  background-color: blue;
  font-family: sans-serif;
}

.autocomplete {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  align-items: center;
  justify-content: top;
  padding-top: 100px;
}

input {
  font-size: 2em;
  width: 300px;
}

.autocomplete-results {
  display: none; // Se indica None, para que no se muestre, luego con el javascript lo habilitaremos
  width: 300px;
  margin-top: -2px;
  font-size: 1.3em;
  color: #eee;
  list-style: none;
  margin: 0;
  padding: 0;
}

  .autocomplete-results li {
    margin: 0;
    padding: 0;
    padding: 10px 0 10px 10px;
    border-right: 2px solid #eee;
    border-bottom: 2px solid #eee;
    border-left: 2px solid #eee;
  }

  .autocomplete-results li:hover {
    background-color: #eee;
    color: blue;
    cursor: pointer;
  }

Y ahora el javascript: script.js:

let input = document.querySelector("input");
let autocomplete_results = document.getElementById('autocomplete-results');

input.addEventListener('keyup',  (event) =>  {
  autocomplete_results.style.display = 'block';
  let key = event.target.value;

  console.log(key)

  if(key.length > 0) {
    search(key);
  }
  else {
    build_list();
  }
})

const search = (key) => {
  fetch(`https://restcountries.eu/rest/v2/name/${key}?fields=name`)
  .then(res => res.json())
  .then(data => {
    if(Array.isArray(data)) {
      build_list(data.map(item => {
        return item.name
      }))
    }
  })
}

const build_list = (items) => {
  console.log('elems', items)

  if(items === undefined) {
    items = [];
  }

  autocomplete_results.innerHTML = '';

  items.slice(0,10).map(item =>  {
    autocomplete_results.innerHTML += `<li>${item}</li>`;
                      })
}

document
  .getElementById("autocomplete-results")
  .addEventListener("click", e => {
    if (e.target && e.target.nodeName == "LI") {

      input.value = e.target.innerHTML;
      build_list()
    }
  });