Ric*_*omi 11 html html5 html-select html-datalist
在下面的代码段中,我有两种方法可以选择项目:使用datalist输入和使用选项进行传统选择.
select元素保持选项值隐藏,我们仍然可以使用它this.value
.但是,对于datalist,实际显示该值,并且该选项的文本内容显示为辅助标签.
我想要的是让输入+数据主义方法的行为类似于传统的选择,其中"Foo"和"Bar"显示为选项,当选择时分别具有值"1"和"2".
我还添加了一个重复的名称"Foo",其值为"3".这表明任何解决方案都不能依赖于唯一选项.
<input list="options" onchange="console.log(this.value)"/>
<datalist id="options">
<option value="1">Foo</option>
<option value="2">Bar</option>
<option value="3">Foo</option>
</datalist>
<select onchange="console.log(this.value)">
<option value=""></option>
<option value="1">Foo</option>
<option value="2">Bar</option>
<option value="3">Foo</option>
</select>
Run Code Online (Sandbox Code Playgroud)
您可以使用data-value
和jquery
来隐藏您的价值。
例如:
$(document).ready(function() {
$('#submit').click(function()
{
var value = $('#selected').val();
alert($('#browsers [value="' + value + '"]').data('value'));
});
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="selected" list="browsers" name="browser">
<datalist id="browsers">
<option data-value="1" value="InternetExplorer"></option>
<option data-value="2" value="Firefox"></option>
<option data-value="3" value="Chrome"></option>
</datalist>
<input id="submit" type="submit">
Run Code Online (Sandbox Code Playgroud)
感谢@guest271314
没有本地方式。对于文本输入
所以不可能让文本输入显示一些与其值不同的文本。
您可以劫持 中的value
getter HTMLInputElement.prototype
,但我不推荐这样做,而且如果值不唯一,我看不出有任何方法可以知道选择了哪个选项。
const des = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
Object.defineProperty(HTMLInputElement.prototype, 'value', {
get: function() {
const value = des.get.call(this);
if (this.type === 'text' && this.list) {
const opt = [].find.call(this.list.options, o => o.value === value);
return opt ? opt.dataset.value : value;
}
return value;
}
});
Run Code Online (Sandbox Code Playgroud)
<input list="options" oninput="console.log(this.value);" />
<datalist id="options">
<option data-value="1">Foo</option>
<option data-value="2">Bar</option>
<option data-value="3">Foo</option>
</datalist>
Run Code Online (Sandbox Code Playgroud)
或者你可以让输入显示选项的值而不是文本,但立即替换它:
document.querySelector('input').addEventListener('input', event => {
const value = event.target.value;
const opt = [].find.call(event.target.list.options, o => o.value === value);
if (opt) {
event.target.value = opt.textContent;
}
});
Run Code Online (Sandbox Code Playgroud)
<input list="options" oninput="console.log(this.value);" />
<datalist id="options">
<option value="1">Foo</option>
<option value="2">Bar</option>
<option value="3">Foo</option>
</datalist>
Run Code Online (Sandbox Code Playgroud)
在第二个示例中,oninput="console.log(this.value)"
显示选项的值,因为该代码在将值替换为文本内容之前运行。如果您希望以后的.value
访问返回选项值,则需要value
像第一个示例中那样劫持getter。