【问题标题】:select2 force focus on page loadselect2 强制关注页面加载
【发布时间】:2013-05-14 12:14:36
【问题描述】:

我正在尝试让一个 select2 框在页面加载时以 focused 状态出现。我尝试了以下方法:

$('#id').select2('focus');
$('#id').trigger('click');
$('#id').trigger('focus');

似乎只有第一行有任何效果,它确实聚焦了 select2 字段,但是它需要额外的按键来显示搜索字段,并允许输入搜索字符串。

因此,如果您加载页面并开始输入:“Search”,“S”将打开搜索框,然后将其余键输入其中,因此您将搜索“earch”

【问题讨论】:

    标签: jquery jquery-select2


    【解决方案1】:

    根据 Select2 文档:

    $('#id').select2('open');
    

    应该是你所需要的。

    位于documentation程序化访问部分下。

    【讨论】:

    • $('#id').select2('open');将设置焦点并打开 select2 准备搜索。 $('#id').select2('focus');会将焦点设置在 select2 上,但不会打开 select2 进行搜索。
    • 作为@AdrianP。说,它也打开它......而且focus选项不是很直观:jsfiddle.net/mJEZK/13
    【解决方案2】:

    这适用于版本 3.4.2。不知道它是什么时候实现的。

    $('#id').select2('focus');
    

    【讨论】:

    • 我在文档中的任何地方都找不到这个!非常感谢分享这个!
    • 也适用于 4.0。仍然没有记录。
    【解决方案3】:

    如果你使用:

    $('#id').select2('open');
    

    select2打开了,可以直接输入搜索。

    如果你使用:

    $('#id').select2('open').select2('close');
    

    焦点设置到创建的 select2 下拉列表。如果你在键盘上点击EnterCtrl + Arrow down,就可以打开它。

    个人认为这个比:

    $('#id').select2('focus');
    

    因为您无法真正用键盘打开 select2 下拉列表。

    【讨论】:

    • 正是我正在寻找的行为。值得更多的支持。
    • $('#id').select2('open').select2('close'); 有在 select2 v4.0 中工作的好处,而其他似乎都没有。谢谢!
    • 另一种解决方案是直接用$('.select2-search__field').focus(); 将焦点设置在创建的输入元素上
    【解决方案4】:

    Select2 创建自己的输入,因此请尝试以下操作:

    $(window).load(function(){
      $('#id').prev('.select2-container').find('.select2-input').focus();
    });
    

    【讨论】:

      【解决方案5】:

      这对我有用,它还将闪烁的光标放在输入字段中。订单很重要!

      $('#s2id').select2('focus');
      $('#s2id').select2('open');
      

      【讨论】:

        【解决方案6】:

        在 Select2 4.0.2 上,我遇到了 select2('focus') 的问题。列表看起来很集中,但是当我按 ENTER 时,列表没有打开。
        对我来说,这就是解决方案。

        $('#id').select2();
        $('.select2-selection', $('#id').next()).focus();
        or
        $('#id').next().find('.select2-selection').focus();
        

        【讨论】:

          【解决方案7】:

          https://forums.select2.org/t/search-being-unfocused/1203/10 中所述,目前在 Select2 4.x 和 JQuery 3.6.0 的组合中焦点被破坏

          两个修复:降级到 JQuery 3.5.1 或

          // hack to fix jquery 3.6 focus security patch that bugs auto search in select-2
          $(document).on('select2:open', () => {
              document.querySelector('.select2-search__field').focus();
          });
          

          【讨论】:

          • 这是一个重要的提示。拯救我的一天!谢谢
          【解决方案8】:

          我尝试了其他 2 个答案,但运气不佳,可能是因为我通过 json 填充控件,并且一开始它只是一个隐藏输入,因此编程的 open 方法没有任何效果。

          但是,以下内容对我来说很好:

          $(document).ready(function() 
          {     
              $('#s2id_autogen1').focus();
          });
          

          如果由于某种原因在您的设置中没有出现相同的 id,则查找附加了 select2-focusser 类的控件。

          【讨论】:

            【解决方案9】:

            我们有一个 textfield 作为 select2 并使用以下 sn-p 来激活并将光标聚焦在文本输入中。所有其他选项都对我们不起作用,因为它们只打开了 select2 选项,但没有产生预期的行为。

            $('#s2id_autogen1').click()
            $('#s2id_autogen1').focus()

            【讨论】:

              【解决方案10】:

              在 Select2 4.0 上,方法 .select2('focus') 什么都不做。但是,我的解决方法是简单地获取具有“aria-labelledby”属性的“span”元素(注意该值是基于 id 的,所以它是唯一的),并关注它:

              var $field = $('select');
              $field.select2();
              var id = $field.attr('id');
              var $spanLabel = $field.next().find("span[aria-labelledby='select2-" + id + "-container']");
              $spanLabel.focus();
              

              【讨论】:

                【解决方案11】:

                Dan-Nolan 已经很好地回答了,但对于那些不熟悉 Select2 的人来说,需要注意一点:在调用其函数之前,需要使用 select2 初始化 html 对象:

                所以最终的代码应该是

                $('#id').select2();
                
                $('#id').select2('open');
                

                【讨论】:

                  【解决方案12】:

                  根据 select2 文档:

                  $('document').ready(function(){
                     var opencustomer = $("#changedatachange").select2();
                     opencustomer.select2("open");
                  });
                  

                  【讨论】:

                  【解决方案13】:

                  使用这个序列:

                  $('#id').select2('open');
                  $('#id').select2('close');
                  

                  【讨论】:

                  • 一般来说,如果答案包括对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。 (这篇文章被至少一个用户标记,大概是因为他们认为应该删除没有解释的答案。这可能无助于你的情况,这似乎与长期以来接受的答案没有明显的原因不同。)
                  猜你喜欢
                  • 2021-05-18
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-10-22
                  • 1970-01-01
                  • 2012-09-28
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多