Autocomplete nativo con datalist
Un intersante y poco conocido elemento HTML5 es <datalist>
, con el cual permite crear de forma nativa un campo de input con autocomplete, y con nativo me refiero sin JavaScript.
Para utilizarlo, necesitarás un campo de <input />
común y corriente y linkearlo con el listado de palabras/términos a ser desplegados cuando el usuario tipea en este <input />
:
<label>Marcas de Cerveza</label>
<input list="cervezas" placeholder="Escribe una marca de cerveza:" />
Ahora construímos el listado con <datalist>
y en cada <option>
las opciones disponibles:
<datalist id="cervezas">
<option value="Heineken" />
<option value="Budweiser" />
<option value="Skol" />
<option value="Cristal" />
<option value="Quilmes" />
<option value="Estrella Damm" />
<option value="Sol" />
<option value="Cusqueña" />
<option value="Paceña" />
<option value="Tecate" />
<option value="Corona" />
<option value="Águila" />
<option value="Guinness" />
<option value="Carlsberg" />
<option value="Becks" />
<option value="Brahma" />
<option value="Polar" />
<option value="Medalla" />
</datalist>
Nótese que para linkear el <input />
con el <datalist>
se utiliza el atributo list=“ID-DEL-DATALIST”. Otro detalle, el autocomplete detecta las primeras letras de la palabra/término definido en cada <option />
y no las letras intermedias que contiene la palabra.
Carga dinámica de datos⌗
Si la lista llega a ser muy extensa, podemos hacer una carga dinámica de las palabras/términos mediante AJAX. Para ello necesitaremos un poco de JavaScript.
Carguemos el listado de países en un campo mientras el usuario está escribiendo en él:
<input id="paises" list="json-paises" placeholder="Escribe el nombre de un país" />
<datalist id="json-paises"></datalist>
JavaScript para llamar el JSON por AJAX y llenar el <datalist>
con los países:
// Definición de un par de variables
var dataList = document.querySelector('#json-paises'),
input = document.querySelector('#paises');
// Creamos un nuevo XMLHttpRequest
var request = new XMLHttpRequest();
// Una ves listo, definimos eventos para sus estados
request.onreadystatechange = function(response) {
if (request.readyState === 4) {
if (request.status === 200) {
// Parseando JSON
var jsonOptions = JSON.parse(request.responseText);
// Iterando sobre el arreglo JSON
jsonOptions.forEach(function(item) {
// Creando un option por cada país.
var option = document.createElement('option');
option.value = item;
dataList.appendChild(option);
});
input.placeholder = "Escribe el nombre de un país";
} else {
// Error!
input.placeholder = "Error al cargar lista de países ;^(";
}
}
};
// Cambiamos el texto del placeholder
input.placeholder = "Cargando países";
// Abrimos y enviamos el request
request.open('GET', 'json-paises.json', true);
request.send();
El formato del json-paises.json:
[
"Afganistán",
"Albania",
"Alemania",
"Andorra",
"Angola",
"Anguila",
"Antigua y Barbuda",
...
]
Soporte:⌗
Desde IE10, pasando por Firefox, Chrome, Opera, Android Browser y sólo Safari decepcionando.