请注意,这与 不同。它允许用户输入不在列表中的自定义值,并且如果不先定义此类输入,就不可能获取此类输入的备用值。datalist
select
处理用户输入的可能方法是按原样提交输入的值、提交空白值或阻止提交。此答案仅处理前两个选项。
如果您想完全禁止用户输入,也许会是一个更好的选择。select
若要在下拉列表中仅显示 的文本值,我们为其使用内部文本并省略该属性。我们要发送的实际值存储在自定义属性中:option
value
data-value
要提交此内容,我们必须使用 .在这种情况下,我们省略了常规输入,并将其移动到隐藏副本。data-value
<input type="hidden">
name="answer"
<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
<option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">
这样,当原始输入中的文本发生变化时,我们可以使用javascript来检查文本是否也存在于中并获取其.该值将插入到隐藏的输入中并提交。datalist
data-value
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;
}
}
});
脚本需要 id 以及常规和隐藏输入,以便知道哪个输入属于哪个隐藏版本。这样,就可以在同一页面上有多个 s,其中一个或多个 s 提供建议。answer
answer-hidden
input
datalist
任何用户输入都将按原样提交。要在数据列表中不存在用户输入时提交空值,请将hiddenInput.value = inputValue
hiddenInput.value = ""
工作jsFiddle示例:普通javascript和jQuery