在 BootstrapVue 自动完成中识别数据列表选择与文本输入
Recognize datalist selection vs. text input in BootstrapVue Autocomplete
有以下示例代码,我想知道正确的event/method来区分输入中填写的值是手动输入的还是从<datalist>
中选择的。
模板:
<div>
<b-form-input list="my-list-id"
v-on:change="handleChange" v-model="sizeSel"/>
<datalist id="my-list-id">
<option v-for="size in sizes">{{ size }}</option>
</datalist>
</div>
JAVASCRIPT:
{
data() {
return {
sizeSel: '',
sizes: ['Small', 'Medium', 'Large', 'Extra Large']
}
},
watch: {
},
methods: {
handleChange() {
alert(this.sizeSel);
}
}
}
使用keydown
<datalist>
没有自己的活动,但无论如何都可以做到。
键盘事件和 <datalist>
点击都会触发输入的 keydown
侦听器,但只有键盘事件具有 key
属性。因此,如果 keydown
在没有 key
属性 的情况下被触发,您就知道这是来自列表的点击:
试试这个:
new Vue({
el: "#app",
data() {
return {
sizes: ['Small', 'Medium', 'Large', 'Extra Large'],
sizeSel: '',
sizeChangedBy: null
}
},
methods: {
onkeydown(e) {
const eventSource = e.key ? 'input' : 'list';
this.sizeChangedBy = eventSource;
}
},
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<div>
Event source: {{ sizeChangedBy }}<br />
<label for="myInput">Choose one:</label>
<input list="sizes" id="myInput" name="myInput" v-model="sizeSel" @keydown="onkeydown($event)" />
<datalist id="sizes">
<option v-for="size in sizes" :key="size" :value="size"></option>
</datalist>
</div>
</div>
有以下示例代码,我想知道正确的event/method来区分输入中填写的值是手动输入的还是从<datalist>
中选择的。
模板:
<div>
<b-form-input list="my-list-id"
v-on:change="handleChange" v-model="sizeSel"/>
<datalist id="my-list-id">
<option v-for="size in sizes">{{ size }}</option>
</datalist>
</div>
JAVASCRIPT:
{
data() {
return {
sizeSel: '',
sizes: ['Small', 'Medium', 'Large', 'Extra Large']
}
},
watch: {
},
methods: {
handleChange() {
alert(this.sizeSel);
}
}
}
使用keydown
<datalist>
没有自己的活动,但无论如何都可以做到。
键盘事件和 <datalist>
点击都会触发输入的 keydown
侦听器,但只有键盘事件具有 key
属性。因此,如果 keydown
在没有 key
属性 的情况下被触发,您就知道这是来自列表的点击:
试试这个:
new Vue({
el: "#app",
data() {
return {
sizes: ['Small', 'Medium', 'Large', 'Extra Large'],
sizeSel: '',
sizeChangedBy: null
}
},
methods: {
onkeydown(e) {
const eventSource = e.key ? 'input' : 'list';
this.sizeChangedBy = eventSource;
}
},
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<div>
Event source: {{ sizeChangedBy }}<br />
<label for="myInput">Choose one:</label>
<input list="sizes" id="myInput" name="myInput" v-model="sizeSel" @keydown="onkeydown($event)" />
<datalist id="sizes">
<option v-for="size in sizes" :key="size" :value="size"></option>
</datalist>
</div>
</div>