在没有像 jQuery 这样的依赖项的情况下执行此操作的一种非常混乱的方法(编辑:我意识到 OP 正在使用 jQuery,但是无论有没有 jQuery,这种方法都可以很好地集成,因此可能会帮助其他没有使用的人)。
首先,交换你的值和文本节点,如下所示:
<input list="browsers" name="browser" id="my_input">
<datalist id="browsers">
<option value="Internet Explorer">1</option>
<option value="Firefox">2</option>
<option value="Chrome">3</option>
<option value="Opera">4</option>
<option value="Safari">5</option>
</datalist>
<input type="submit">
这可确保输入始终为用户显示正确的值。然后添加一些 JavaScript 来检查对应值的文本节点,如下所示:
let $input = document.getElementById('my_input');
let $datalist = document.getElementById('browsers');
$input.addEventListener('change', () => {
let _value = null;
let input_value = $input.value;
let options = $datalist.children;
let i = options.length;
while(i--) {
let option = options[i];
if(option.value == input_value) {
_value = option.textContent;
break;
}
}
if(_value == null) {
console.warn('Value does not exist');
return false;
}
console.log('The value is:', _value );
});
您也可以将'change'
事件侦听器更改为'keyup'
,以获得实时反馈。而不是console.log('The value is:', _value )
您可以简单地添加一个额外的hidden
输入来存储值,从而允许您发送值和 id。
这使用现代 JavaScript 表示法,但要使其向后兼容,只需将'change', () => {
调用'change', function() {
更改let
为var
.
更新:使用 ES6
比上面稍微更新的答案
const input = document.getElementById('my_input');
const list = document.getElementById('browsers');
input.addEventListener('change', () => {
const {value: inputVal} = input
const children = Array.from(list.children)
// Fetch matched elem
const [matchedElem] = children.filter(({value}) => value === inputVal)
// If element doesn't exist, no matches
if(!matchedElem) {
console.log('No matches found')
return
}
// Do whatever
console.log('Matched value for', matchedElem.value, 'is', matchedElem.textContent)
});
<input type="search" list="browsers" name="browser" id="my_input">
<datalist id="browsers">
<option value="Internet Explorer">1</option>
<option value="Firefox">2</option>
<option value="Chrome">3</option>
<option value="Opera">4</option>
<option value="Safari">5</option>
</datalist>
<input type="submit">