jQuery Select2 - 使用选项卡选择一个选项

Posted

技术标签:

【中文标题】jQuery Select2 - 使用选项卡选择一个选项【英文标题】:jQuery Select2 - Use tab to select an option 【发布时间】:2018-11-09 08:15:31 【问题描述】:

我希望能够使用箭头键进入我想要的 select2 选项,然后按 Tab 键选择该选项,然后像往常一样使用 Tab 键转到下一个元素。

我已经得到了打开 select2 的向下箭头:

$(document).on('keydown', '.select2', function(e) 
  if (e.originalEvent && e.which == 40) 
    e.preventDefault();
    $(this).siblings('select').select2('open');
   
);

我还可以使用箭头到达我需要去的地方。现在我正在努力使标签部分工作。

我假设因为select2-search__field 在我按下键时有焦点,那是我将事件绑定到的元素?然后大概我需要获取当前突出显示选项的值并触发 select2 更改?

我不是 100% 确定这是正确的方法,但我无法完全弄清楚。

【问题讨论】:

您能否通过添加一个 sn-p 为我们提供一个工作示例? :) 【参考方案1】:

要实现这一点,您可以使用selectOnClose: true

$(document).on('keydown', '.select2', function(e) 
  if (e.originalEvent && e.which == 40) 
    e.preventDefault();
    $(this).siblings('select').select2('open');
  
);

$('select').select2(
  selectOnClose: true
);
select 
  min-width: 150px;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css" />
<select>
  <option>AAAAA</option>
  <option>BBBB</option>
  <option>CCCC</option>
  <option>DDDD</option>
  <option>EEEE</option>
  <option>FFFF</option>
  <option>GGGG</option>
</select>

【讨论】:

啊,太好了,谢谢。猜猜我把事情复杂化了!唯一不能处理的是恢复默认行为,即切换到页面上的下一个元素。是否有同样简单的方法来实现这一点,还是需要手动完成? 有效,但我不需要selectOnClose 我可以工作,但在关闭时它会选择最新突出显示的选项,这不是所需的行为,我只需要在按键 enter/tab 上选择所选选项。 这种方法的另一个问题是 Esc 也会选择关闭,这不是很直观的行为。【参考方案2】:

只需在您的代码中添加以下行。

$(document).on("select2:close", '.select2-hidden-accessible', function ()  $(this).focus(); );

您的问题将得到解决。

【讨论】:

【参考方案3】:

我也有同样的问题。因为selectOnClose: true 也意味着按下 Esc 或在选择下拉列表之外单击是选择输入,所以我选择了一个比接受的答案更复杂且不那么优雅的解决方案。我的解决方案为我解决了这个问题(并允许随后的选项卡将焦点切换到 DOM)。

我为 select2:closing 添加了一个侦听器(它在关闭之前立即触发,因此当突出显示的 li 仍然突出显示时)。 Select2 为该 li 提供一个 id,其中包含与其相关的选项的值。我将其解析出来并将其保存在状态中(我正在使用 Vue):

$(this.subjectSelect2).on('select2:closing', () => 
    var idArray = $(".select2-results__option--highlighted")[0].id.split("-");
    var id = idArray[idArray.length - 1];
    this.select2LastHighlighted = id;
)

然后我为 keydown 添加了一个监听器,这样如果按下了 tab,它就会从 state 中获取该值,并将 select2 更新为该值:

$(this.subjectSelect2).on('select2:open', () => 
    $(".select2-search__field")
        .on('keydown', (e) => 
            if (e.key == 'Tab') 
                this.subjectSelect2.val(this.select2LastHighlighted);
                this.subjectSelect2.trigger('change');
            
        )
)

我很想知道是否有人有更优雅的方式来做到这一点!

【讨论】:

以上是关于jQuery Select2 - 使用选项卡选择一个选项的主要内容,如果未能解决你的问题,请参考以下文章

select2 jquery插件重置具有预选项目的选择元素

使用 jquery 以编程方式选择 select2 选项

Select2 使用 jquery 隐藏选项

在引导选项卡中选择 2 挤压下拉列表

按下选项卡时如何在焦点上打开 select2 下拉菜单

如何使用配置了ajax搜索的select2 jquery插件实现选择所有功能。?