DEV Community

Michael Burrows
Michael Burrows

Posted on • Edited on • Originally published at w3collective.com

Create an autocomplete textbox using vanilla JavaScript

[Codepen Demo]

This article will cover the process of adding autocomplete functionality to a textbox with JavaScript.

Let’s start with the HTML markup:

<input type="text" id="autocomplete" placeholder="Select a color..."></input>
<ul id="results"></ul>
Enter fullscreen mode Exit fullscreen mode

Now for the JavaScript, starting with a data array that’ll be used to populate the autocomplete results:

const data = ["red", "blue", "green", "yellow", "purple", "orange", "black", "white", "brown"];
Enter fullscreen mode Exit fullscreen mode

Next declare some variables for the autocomplete input text and the results unordered list:

const autocomplete = document.getElementById("autocomplete");
const resultsHTML = document.getElementById("results");
Enter fullscreen mode Exit fullscreen mode

We’ll then create a function that outputs any data matching the users search query into the results list:

autocomplete.oninput = function () {
  let results = [];
  const userInput = this.value;
  resultsHTML.innerHTML = "";
  if (userInput.length > 0) {
    results = getResults(userInput);
    resultsHTML.style.display = "block";
    for (i = 0; i < results.length; i++) {
      resultsHTML.innerHTML += "<li>" + results[i] + "</li>";
    }
  }
};
Enter fullscreen mode Exit fullscreen mode

If you have a large data set you may want to change userInput.length to > 3 to limit the length of the results.

In the previous step we called getResults(userInput) which doesn’t exist yet so let’s create it:

function getResults(input) {
  const results = [];
  for (i = 0; i < data.length; i++) {
    if (input === data[i].slice(0, input.length)) {
      results.push(data[i]);
    }
  }
  return results;
}
Enter fullscreen mode Exit fullscreen mode

What this function does is return a new array containing only the data matching the users search query.

Finally functionality for when a user clicks the results it’s text is set as the autocompletes value:

resultsHTML.onclick = function (event) {
  const setValue = event.target.innerText;
  autocomplete.value = setValue;
  this.innerHTML = "";
};
Enter fullscreen mode Exit fullscreen mode

Add some CSS and you’ve got yourself a fully functioning autocomplete textbox.

Top comments (5)

Collapse
 
tbroyer profile image
Thomas Broyer

Most of the time, you won't want to implement it yourself: how about keyboard use? How about accessibility?

At a minimum, the native <datalist> should do better than your solution, with even fewer code (no JS \o/ )
caniuse.com/#feat=datalist

Collapse
 
dailydevtips1 profile image
Chris Bongers

Datalist is nice, but only limited styling and browser support is a bit of a gamble at this point, with Partial support.

Collapse
 
kvetoslavnovak profile image
kvetoslavnovak • Edited

Datalist is unfortunately really really "user unfriendly" on mobile. Just open your iPhone and try it for yourself.

Collapse
 
dailydevtips1 profile image
Chris Bongers

Hey, you can also embed the full Codepen to render in your article (i only learned this recently) There is a small docs next to making your post it shows all embeds.

Also agree with Thomas, Datalist would be a nice html solution

Collapse
 
michaelburrows profile image
Michael Burrows

Thanks for the tip re:Codepen :)