Escriba o elija algun <b>navegador</b> que figure en las siguientes opciones:
<input list="navegadores">
<datalist id="navegadores">
<option value="Internet Explorer">
<option value="Firefox">
<option value="Chrome">
<option value="Opera">
<option value="Safari">
</datalist>
<br><br>
Escriba o elija alguna <b>fruta</b> que figure en las siguientes opciones:
<input list="frutas">
<datalist id="frutas">
<option value="Albaricoque">
<option value="Almendra">
<option value="Ciruela">
<option value="Frambuesa">
<option value="Fresa">
<option value="Mandarina">
<option value="Manzana">
</datalist>
<script>
//FUNCION QUE GENERA UN OBJETO DE CONFIGURACION PARA LA FUNCION forzarDatalist()
function configDatalist(datalistID){
const _inp=document.querySelectorAll("[list='"+datalistID+"']")[0]
datalistID=document.getElementById(datalistID).getElementsByTagName("option")
if(datalistID){
let l=datalistID.length, max=0, _opciones=Array(l), _hay
for(let i=0; i<l; i++){
let x = datalistID[i].value.length
_opciones[i]=datalistID[i].value.toLowerCase()
if(x>max)max=x
}
_hay=Array(max)
for(let i=0; i<max; i++){
_hay[i]=false
}
for(i in _opciones){
_opciones[i]=Array.from(_opciones[i])
}
return {opciones:_opciones, hay:_hay, inp:_inp, ultimo:"", eventos:true}
} else return false
}
//FUNCION EN CUESTION, REQUIERE EN SU PARÁMETRO UN OBJETO DE CONFIGURACION GENERADO POR LA FUNCION configDatalist
function forzarDatalist(Config){
let inp=Array.from(Config.inp.value.toLowerCase())
let coincidencia=Array()
if(inp.length){
let si=true
for(i in inp){
if(si){
si=false
for(i2 in Config.opciones){
if(i==0&&inp[i]===Config.opciones[i2][i]){
si=true
Config.hay[i2]=true
} else if(Config.hay[i2]&&inp[i]===Config.opciones[i2][i]){
si=true
Config.hay[i2]=true
} else {
Config.hay[i2]=false
}
}
} else {
break
}
}
if(si){
Config.ultimo=Config.inp.value
} else {
Config.inp.value=Config.ultimo
}
} else {
Config.ultimo=""
}
if(Config.eventos){
Config.inp.addEventListener("keyup", ()=>{forzarDatalist(Config)})
Config.inp.addEventListener("change", ()=>{forzarDatalist(Config)})
Config.eventos=false
}
}
//PUESTO EN PRÁCTICA
var ConfiguracionNavegadores, ConfiguracionFrutas
window.onload=function(){
//NAVEGADORES
ConfiguracionNavegadores = configDatalist("navegadores")
forzarDatalist(ConfiguracionNavegadores)
//FRUTAS
ConfiguracionFrutas = configDatalist("frutas")
forzarDatalist(ConfiguracionFrutas)
}
</script>