【问题标题】:JQuery UI Datepicker loses focus when selecting date with mouse使用鼠标选择日期时,JQuery UI Datepicker 失去焦点
【发布时间】:2009-09-09 20:31:13
【问题描述】:

我正在使用带有 datepicker 的 JQuery ui,当用户在某个字段上使用选项卡时,他们会适当地弹出日历。

  1. 用户选项卡(通过键进入字段
  2. 用户通过鼠标点击选择日期
  3. 用户标签
  4. Tabindex 从一个开始(在表单的开头)

这里是代码。 (也可以设置标签索引)

<input type="text" name="demo" />
<input type="text" class="date" />

jquery代码为:

$(".date").datepicker();

关于我如何解决这个问题的任何建议(最短解决方案的奖励)?

【问题讨论】:

标签: jquery jquery-ui


【解决方案1】:

订阅onCloseonSelect 事件:

$("#someinput").datepicker(
{
    // other options goes here
    onSelect: function ()
    {
        // The "this" keyword refers to the input (in this case: #someinput)
        this.focus();
    }
});

或者在onClose的情况下:

$("#someinput").datepicker(
{
    onClose: function ()
    {
        this.focus();
    }
});

【讨论】:

  • 这两种方法都有效,但是日历再次下降。有什么快速解决方案吗?
  • 如果我能让它专注于下一个字段... onClose:function(){ focus on next field }(会工作)。有什么建议吗?
  • -1:这将一个问题换成另一个问题,因为它会导致日历小部件重新出现。
  • -1:这些都不会导致焦点回到 Chrome 25 上的输入字段。
  • 如果您的日历设置为仅在“按钮”上弹出(显示:“按钮”),那么此解决方案可以完美运行! @DanielAllenLangdon,这不会将一个问题换成下一个问题,您精通键盘的用户可以继续切换到下一个控件,日历将再次关闭。如果没有此解决方案,您的用户必须使用鼠标手动聚焦下一个控件。基本上,这个解决方案解决了用户必须重新专注于选择日期的问题。
【解决方案2】:

感谢 Jeff 的建议,我修改了您的 onSelect 函数以使用属性过滤器仅检索具有“nexttab”指定的 tabindex 的元素。

$(function(){
  $(".date").datepicker({
      onSelect: function(){
          currenttab = $(el).attr("tabindex");
          nexttab = currenttab * 1 + 1;
          $("[tabindex='" + nexttab + "']").focus();
      }
  });
});

PS: 如果您的代码中没有指定 tabindexes,就像我之前忽略的那样,只需添加以下代码:

$('input, select').each(function(i, val){
    $(this).attr('tabindex', i + 1);
});

【讨论】:

    【解决方案3】:

    请参阅有关此问题的讨论 http://bugs.jqueryui.com/ticket/7266 有一个解决方案 http://jsfiddle.net/lankarden/9FtnW/

    【讨论】:

    • 这个特殊的解决方案只适用于我的 Chrome - 在 IE 中(我知道,我知道......)它会导致日历弹出两次。
    • -1:截至今天,7266 号票已作为 7765 号票的副本关闭,但 7765 号票仍是未解决的开放错误。调用focus()的思路在IE中是个问题,日历又弹出来了。
    【解决方案4】:

    类似于 Jimmy 的方法,但这会将焦点设置为日历图标(假设您的日历使用图标),当我有多个日期选择器并排放置时,我发现这种方式更合适。

    设置日期默认选项,以便在日历弹出窗口关闭时将焦点设置为图标:

        $(".date").datepicker({
            onClose: function() {
                $(this).next('a').focus(); 
            }
        });
    

    为日历图标添加标签,使其具有焦点:

        $(".date").each(function() {
            $($(this).next('img')).wrap($("<A/>").attr("href","#"));
        });
    

    【讨论】:

    • +1:我喜欢这个解决方案,因为它在用户看来好像焦点仍然在他们单击的输入字段上,而不是将焦点移动到下一个字段,这不是预期的行为。这适用于 Chrome 25、IE 9、Opera 12、Firefox 19 和 Safari 5。谢谢!
    • 我添加了图标只是为了使用这个解决方案。它保持标签顺序,而无需明确指定它。谢谢!
    【解决方案5】:

    如果您真的不关心 Tab 键顺序,也就是说,没有分配它以便它遵循页面的流程,您可以这样做。

    jQuery('.date').datepicker({
        'onSelect': function(){
            $(this).nextAll('input, button, textarea, a').filter(':first').focus();
        }
    });
    

    它的工作假设是当用户选择日期时,他完成了该字段并移至下一个字段,因此它只是选择下一个字段。

    【讨论】:

      【解决方案6】:

      当日期选择器关闭时,您可能可以使用onClose 事件将焦点返回到您的输入,因为this 指的是该回调中的关联输入字段。例如:

      $('.date').datepicker({
         onClose: function() { this.focus(); }
      });
      

      【讨论】:

      • 这会导致日历在 IE 中再次弹出。
      【解决方案7】:

      让它专注于同一个框最终会导致日期选择器重新弹出,我们真正想要的是让它进入下一个字段。这是设计的解决方案:

      1. 需要在您的字段上设置 tabindex 属性。
      2. 这是在 JavaScript 中从字符串转换为 int(* 1)。
      3. 这实际上将所选字段移动到下一个元素,而不是当前焦点

        $(function(){
          $(".date").datepicker({
              onSelect: function(){
                  currenttab = $(this).attr("tabindex");
                  nexttab = currenttab * 1 + 1;
                  $(":input").each(function(){
                      if ($(this).attr("tabindex") == nexttab)
                         $(this).focus();
                  });
          }
          });
        });
        

      感谢任何改进此技术的建议。

      【讨论】:

      • 有时 tabindex 等于 "nexttab" 的元素可能会被隐藏或无法聚焦。您应该进行测试以确保 $(this) 能够获得焦点。
      【解决方案8】:

      我也必须解决这个问题,发现给定的答案并不是我想要的。这就是我所做的。

      blog 提到了一个 jQuery 函数,它允许您选择屏幕上的下一个表单元素。我将它导入到我的项目中并在日期选择器对话框的关闭时调用它。

      如果链接失效,这里是函数

      $.fn.focusNextInputField = function() {
          return this.each(function() {
              var fields = $(this).parents('form:eq(0),body').find('button,input,textarea,select');
              var index = fields.index( this );
              if ( index > -1 && ( index + 1 ) < fields.length ) {
                  fields.eq( index + 1 ).focus();
              }
              return false;
          });
      };
      

      然后在日期选择器的关闭时简单地调用它

      $(this).datepicker({
          onClose: function () {
             $(this).focusNextInputField();
          }
      });
      

      希望这对未来的访客有所帮助。

      【讨论】:

        【解决方案9】:

        按下回车键(默认选择今天的日期)或使用此按钮从日历中单击日期时,我能够将焦点移到下一个输入字段

        $(".jqDateField").datepicker('option', {
            dateFormat: 'mm/dd/y', onClose: function () {
                $(':input:eq(' + ($(':input').index(this) + 1) + ')').focus();
            }
        });
        

        如果您在“方式”中有选择或输入按钮,则可能需要将焦点设置在下一个文本输入上

        $(':input[type="text"]:eq(' + ($(':input[type="text"]').index(this) + 1) + ')')
        

        【讨论】:

          【解决方案10】:

          我在 datepicker 输入控件旁边添加了一个空的 href 标记,并在 onClose 事件处理程序中关注它。这解决了我在日历关闭时焦点一直转移到页面顶部的问题。我正在使用那个 href 标签来显示错误消息;因此它对我有两个目的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-17
            • 1970-01-01
            • 2010-11-29
            • 2012-07-21
            • 1970-01-01
            相关资源
            最近更新 更多