Tenga en cuenta que datalistno 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 selectsea una mejor opción.
Para mostrar solo el valor de texto de optionen el menú desplegable, usamos el texto interno y omitimos el valueatributo. El valor real que queremos enviar se almacena en un data-valueatributo personalizado :
Para enviar esto data-valuetenemos 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 datalisty 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 answery answer-hiddenla 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 inputelectrónicos en la misma página con uno o más datalistcorreos 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 = inputValueahiddenInput.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.