当我们点击 select 2 下拉菜单时,将焦点设置为搜索文本字段

use*_*877 7 html jquery twitter-bootstrap jquery-select2

我正在使用 select2.js Version: 3.4.3 with bootstrap 我有一个下拉菜单。

在此处输入图片说明

当我点击下拉菜单时,我得到了带有搜索文本字段的列表。但是我的光标没有集中在搜索文本字段上。 在此处输入图片说明

<form:select path="yearAge" id="yearAgeId"
    cssClass="form-control search-select static-select">
    <form:option value="">Years</form:option>
    <c:forEach var="i" begin="1" end="125"  >
    <form:option value="${i}" label="${i}"></form:option>
    </c:forEach>     
</form:select>


$(".search-select.static-select").select2({
    placeholder: $(this).attr('placeholder'),
    allowClear: true
});
Run Code Online (Sandbox Code Playgroud)

当我单击下拉光标时,焦点应设置为自动搜索文本字段。

谢谢...!!!!!

小智 23

尝试这个

$(document).on('select2:open', (e) => {
    const selectId = e.target.id

    $(".select2-search__field[aria-controls='select2-" + selectId + "-results']").each(function (
        key,
        value,
    ){
        value.focus();
    })
})
Run Code Online (Sandbox Code Playgroud)

  • 这是混合单选和多选框的页面的唯一解决方案。当您只有单选下拉菜单但多选却一团糟时,@hammad-ahmed-khan 的上述答案非常好。这与 select2 对于所有单选只有一个搜索框并为每个下拉列表重复使用它的方式有关,但多选总是使其搜索框可见。 (6认同)

Ham*_*han 17

如果 jQuery 3.6.0 导致了这个,你可以使用这个:

 $(document).on('select2:open', () => {
    document.querySelector('.select2-search__field').focus();
  });
Run Code Online (Sandbox Code Playgroud)

  • 这节省了我很多时间。由于这可能是 select2 和 jQuery 3.6.0 版本组合的问题,因此未来的某个版本可能会允许您再次仅使用 jQuery 选择器来执行此操作。我无法弄清楚为什么 jQuery 选择器不起作用,直到我看到这个答案,并找到 https://github.com/select2/select2/issues/5993#issuecomment-800927000 (4认同)
  • 当您使用带有“multiple”标志的“select”时,将选择器更改为“input.select2-search__field”。 (3认同)
  • 小但有用的改进。它避免了标签 `if (!event.target.multiple) { $('.select2-container--open .select2-search--dropdown .select2-search__field').last()[0].focus() 的问题}` (3认同)
  • 如果页面有多个 select-2 选择框并且您在它们之间切换,则它不起作用。 (2认同)

小智 17

测试并使用jQuery 3.6.0

$(document).on("select2:open", () => {
  document.querySelector(".select2-container--open .select2-search__field").focus()
})
Run Code Online (Sandbox Code Playgroud)

  • 它对我有用。我的jQuery版本是3.6.0,select2版本是4.1.0-rc.0 (3认同)

Nus*_*med 12

这就是我在全球范围内修复的方法

$(document).on('select2:open', (e) => {
        const selectId = e.target.id;
        $(".select2-search__field[aria-controls='select2-"+selectId+"-results']").each(function (key,value,){
            value.focus();
        });
    });
Run Code Online (Sandbox Code Playgroud)


Man*_*idt 7

不要在 DOM 中搜索该元素。相反,$search直接从引发事件的实例获取元素select2:open。由于该错误仅发生在单个选择中,因此您还应该排除多个选择:

$(document).on('select2:open', e => {
    const select2 = $(e.target).data('select2');
    if (!select2.options.get('multiple')) {
        select2.dropdown.$search.get(0).focus();
    }
});
Run Code Online (Sandbox Code Playgroud)


Iva*_*van 5

我尝试了 google 和 stackoverflow 上的所有建议,并花了 4 个小时。唯一有效的方法是将 jQuery 从 3.6 降级到 3.5

"jquery": "^3.6.0" -> "jquery": "3.5.1"
Run Code Online (Sandbox Code Playgroud)

只需放置此即可节省时间

https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.0/jquery.min.js
Run Code Online (Sandbox Code Playgroud)


YOu*_*Zai 4

这个问题可以通过使用 setTimeout() 函数延迟 focus() 的执行时间来解决,我们可以通过修改select2.js中第 # 3321 行的函数来实现这一点

container.on('open', function () {
  self.$search.attr('tabindex', 0);
  //self.$search.focus(); remove this line
  setTimeout(function () { self.$search.focus(); }, 10);//add this line

});
Run Code Online (Sandbox Code Playgroud)

  • 无论它是否有效,这都不是正确的答案。不应修改 Dist 文件,并且不应在生产中使用“select2.js”以支持其缩小版本。此外,行号预计会在每个版本之间发生变化,因此在没有发布版本的情况下给出行号是没有意义的...... (3认同)