Tenga en cuenta que datalist
no es lo mismo que a select
. Permite a los usuarios ingresar un valor personalizado que no está en la lista, y sería imposible obtener un valor alternativo para dicha entrada sin definirlo primero.
Las posibles formas de manejar la entrada del usuario son enviar el valor ingresado como está, enviar un valor en blanco o evitar el envío. Esta respuesta maneja solo las dos primeras opciones.
Si desea no permitir la entrada del usuario por completo, tal vez select
sea una mejor opción.
Para mostrar solo el valor de texto de option
en el menú desplegable, usamos el texto interno y omitimos el value
atributo. El valor real que queremos enviar se almacena en un data-value
atributo personalizado :
Para enviar esto data-value
tenemos que usar un <input type="hidden">
. En este caso, dejamos fuera la name="answer"
entrada normal y la movemos a la copia oculta.
<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
<option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">
De esta manera, cuando el texto en la entrada original cambia, podemos usar javascript para verificar si el texto también está presente en datalist
y recuperar su data-value
. Ese valor se inserta en la entrada oculta y se envía.
document.querySelector('input[list]').addEventListener('input', function(e) {
var input = e.target,
list = input.getAttribute('list'),
options = document.querySelectorAll('#' + list + ' option'),
hiddenInput = document.getElementById(input.getAttribute('id') + '-hidden'),
inputValue = input.value;
hiddenInput.value = inputValue;
for(var i = 0; i < options.length; i++) {
var option = options[i];
if(option.innerText === inputValue) {
hiddenInput.value = option.getAttribute('data-value');
break;
}
}
});
La identificación answer
y answer-hidden
la entrada normal y oculta son necesarios para que el script sepa qué entrada pertenece a qué versión oculta. De esta manera, es posible tener varios correos input
electrónicos en la misma página con uno o más datalist
correos electrónicos que brinden sugerencias.
Cualquier entrada de usuario se envía tal cual. Para enviar un valor vacío cuando la entrada del usuario no está presente en la lista de datos, cambie hiddenInput.value = inputValue
ahiddenInput.value = ""
Ejemplos de trabajo de jsFiddle: JavaScript simple y jQuery
value=""
debería tener prioridad sobre una cadena dentro de las etiquetas, siempre que haya unvalue=""
declarado. Entonces, la sugerencia sería hacer de "la respuesta" su atributo de valor.