【发布时间】:2016-02-03 02:08:05
【问题描述】:
我通过 AJAX 获取用户 ID 和名称并使用 Select2 搜索它们,但我的用户要求能够通过按 Tab 从预先输入的下拉列表中进行选择,有效地将其视为按 Enter 键。这是我的 select2 声明:
$("#user-select").select2({
ajax: {
url: "/api/User",
method: "get",
data: function (params) {
return {
search: params.term
};
},
beforeSend: function () {
$(".loading-results").text("Loading...");
},
processResults: function (data) {
return {
results: data
};
},
cache: true
},
allowClear: true,
placeholder: "Enter a User ID or Name",
templateResult: function (data) {
return "(" + data.id + ") " + data.name;
},
templateSelection: function (data) {
return "(" + data.id + ") " + data.name;
}
“.select2-search__field”似乎是下拉菜单可见时的焦点元素,并且突出显示的元素获得类“select2-results__option--highlighted”。
我尝试了一些解决方案,但似乎没有任何效果,尤其是因为该元素会在下拉菜单打开时出现和消失。不幸的是,我在尝试中丢失了代码,但它们主要包括在焦点输入上点击 Tab 时执行 preventDefault,然后在突出显示的元素上触发单击事件或在输入上触发 enter 键。
我也尝试过调整 selectOnClose 选项,但总的来说这似乎有问题,当我让它正常运行时会导致无限循环,更不用说根据按下的键来覆盖它了。
[编辑]
所选解决方案有效,但不考虑指定的 templateResult,而是显示“()未定义”。因此,我对其进行了调整,将突出显示的答案添加为覆盖 Select 的选定选项,然后在该 Select 上调用 change 事件。
...(与初始选择2相同)
}).on('select2:close', function (evt) {
var context = $(evt.target);
$(document).on('keydown.select2', function (e) {
if (e.which === 9) { // tab
var highlighted = context.data('select2').$dropdown.find('.select2-results__option--highlighted');
if (highlighted) {
var data = highlighted.data('data');
var id = data.id;
var display = data.name;
$("#user-select").html("<option value='" + id + "' selected='selected'>" + display + "</option>");
$("#user-select").change();
}
else {
context.val("").change();
}
}
});
【问题讨论】:
-
你想通了吗?遇到同样的问题。
-
没有骰子,在我在这里发布之前,我已经用尽了大部分的故障排除能力。如果您知道其他任何我应该标记的内容以帮助人们找到可能能够回答的人,请告诉我,我会将其编辑到帖子中。
-
欣赏它 - 我也花了一些时间敲打它,但没有运气。如果我有什么发现我会告诉你的:)
标签: jquery ajax preventdefault jquery-select2-4