Observe que datalist
não é o mesmo que a select
. Ele permite que os usuários insiram um valor personalizado que não está na lista, e seria impossível buscar um valor alternativo para essa entrada sem defini-lo primeiro.
As maneiras possíveis de lidar com a entrada do usuário são enviar o valor inserido como está, enviar um valor em branco ou evitar o envio. Essa resposta trata apenas das duas primeiras opções.
Se você deseja proibir totalmente a entrada do usuário, talvez select
seja uma escolha melhor.
Para mostrar apenas o valor de texto de option
na lista suspensa, usamos o texto interno para ele e omitimos o value
atributo. O valor real que queremos enviar é armazenado em um data-value
atributo personalizado :
Para enviar data-value
, temos que usar um <input type="hidden">
. Nesse caso, deixamos de fora o name="answer"
na entrada regular e o movemos para a cópia 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">
Desta forma, quando o texto na entrada original for alterado podemos usar javascript para verificar se o texto também está presente no datalist
e buscar o seu data-value
. Esse valor é inserido na entrada oculta e enviado.
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;
}
}
});
O id answer
e answer-hidden
na entrada regular e oculta são necessários para o script saber qual entrada pertence a qual versão oculta. Desta forma, é possível ter vários input
s na mesma página com um ou mais datalist
s fornecendo sugestões.
Qualquer entrada do usuário é enviada como está. Para enviar um valor vazio quando a entrada do usuário não estiver presente no datalist, mude hiddenInput.value = inputValue
parahiddenInput.value = ""
Exemplos de trabalho de jsFiddle: javascript simples e jQuery
value=""
deve ter precedência sobre uma string dentro das tags, sempre que houver umvalue=""
declarado. Portanto, a sugestão seria tornar "a resposta" seu atributo de valor.