当前<datalist>,大多数主流浏览器(Safari除外)都支持HTML5 元素,这似乎是一种向输入添加建议的有趣方式。
<datalist>
但是,value属性的实现与上的内部文本之间似乎存在一些差异。例如:
<input list="answers" name="answer"> <datalist id="answers"> <option value="42">The answer</option> </datalist>
选择一个后,输入将填充值而不是内部文本。我只希望用户在下拉列表和输入中看到文本(“答案”),但42像那样select将值传递给Submit。
如何使所有浏览器的下拉列表显示s 的标签(内部文本)<option>,但在 提交value表单时发送属性 ?
s
<option>
请注意,datalist与并不相同select。它允许用户输入不在列表中的自定义值,并且如果不先定义它就无法获取此类输入的替代值。
处理用户输入的可能方法是按原样提交输入的值,提交空白值或阻止提交。该答案仅处理前两个选项。
如果您想完全禁止用户输入,也许select是一个更好的选择。
要仅option在下拉列表中显示的文本值,我们对其使用内部文本,而忽略该value属性。我们要发送的实际值存储在自定义data-value属性中:
要提交此信息,data-value我们必须使用<input type="hidden">。在这种情况下,我们忽略name="answer"常规输入上的,然后将其移至 隐藏副本。
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 answer以及answer-hidden常规和隐藏输入,才能知道哪个输入属于哪个隐藏版本。这样,在同一页面上可以有多个input,其中一个或多个datalist可以提供建议。
任何用户输入均按原样提交。要在数据列表中不存在用户输入时提交空值,请更改hiddenInput.value = label为 hiddenInput.value = ""
hiddenInput.value = label
hiddenInput.value = ""