Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用鼠标选择日期时,JQuery UI日期选择器失去焦点_Jquery_Jquery Ui - Fatal编程技术网

使用鼠标选择日期时,JQuery UI日期选择器失去焦点

使用鼠标选择日期时,JQuery UI日期选择器失去焦点,jquery,jquery-ui,Jquery,Jquery Ui,我将JQuery ui与datepicker一起使用,当用户点击某个字段时,他们会相应地弹出日历 用户选项卡通过按键进入字段 用户通过鼠标单击选择日期 用户选项卡 Tabindex从表单开头的1开始 这是代码。也可以设置选项卡索引 <input type="text" name="demo" /> <input type="text" class="date" /> 对于如何解决此问题,有什么建议吗?当日期选择器关闭时,您可能可以使用onClose事件将焦点返回到您的输

我将JQuery ui与datepicker一起使用,当用户点击某个字段时,他们会相应地弹出日历

用户选项卡通过按键进入字段 用户通过鼠标单击选择日期 用户选项卡 Tabindex从表单开头的1开始 这是代码。也可以设置选项卡索引

<input type="text" name="demo" />
<input type="text" class="date" />
对于如何解决此问题,有什么建议吗?

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

$('.date').datepicker({
   onClose: function() { this.focus(); }
});
订阅onClose或onSelect事件:

或在onClose的情况下:


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

需要在字段上设置tabindex属性。 这是在javascript*1中从字符串转换为int。 这实际上会将选定字段移动到下一个元素,而不是当前焦点


感谢您对这项技术的任何改进建议。

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

$(function(){
  $(".date").datepicker({
      onSelect: function(){
          currenttab = $(el).attr("tabindex");
          nexttab = currenttab * 1 + 1;
          $("[tabindex='" + nexttab + "']").focus();
      }
  });
});
附言: 如果您的代码中没有指定TabIndex,就像我之前忽略的那样,只需添加以下代码:

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

如果您真的不关心选项卡顺序,也就是说,没有分配它,因此它遵循页面的流程,您可以这样做

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

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

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

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

    $(".date").datepicker({
        onClose: function() {
            $(this).next('a').focus(); 
        }
    });
向日历图标添加标记,使其可聚焦:

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

有关此问题的讨论,请参阅 在

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

A提到了一个jQuery函数,它允许您选择屏幕上的下一个表单元素。我将其导入到我的项目中,并将其称为日期选择器对话框的onClose

如果链接失效,下面是函数

$.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;
    });
};

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

按enter键后,我可以将焦点转到下一个输入字段。默认情况下,enter键选择今天的日期,或者使用此键单击日历中的日期

$(".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) + ')')

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

这两项工作都可以完成,但日历又会下降。有什么快速的解决方法吗?如果我能让它专注于下一个领域。。。onClose:函数{关注下一个字段}可以工作。有什么建议吗?-1:这会以一个问题换另一个问题,因为它会导致日历小部件重新出现。-1:这两个问题都不会导致焦点返回到Chrome 25上的输入字段。如果您的日历设置为“仅在按钮上弹出”showOn:按钮,则此解决方案工作正常@DanielAllenLangdon,这不会以一个问题换下一个问题,熟悉键盘的用户可以继续切换到下一个控件,日历将再次关闭。如果没有此解决方案,用户必须用鼠标手动聚焦下一个控件。基本上,此解决方案解决了用户必须重新关注选择日期的问题。另一种解决方案将焦点返回到输入字段,但修复了IE,使其不会重新打开日历:此特定解决方案仅在Chrome中对我有效-在IE中,我知道,我知道。。。这会导致一个日历弹出两次。-1:到今天为止,票证7266已经作为票证7765的副本关闭,但票证7765仍然是一个开放的错误,没有解决方案。调用焦点的想法在IE中是一个问题,日历会再次弹出。这会导致日历在IE中再次弹出。+1:我喜欢这种解决方案,因为在用户看来,焦点似乎仍然在他们单击的输入字段上,而不是将焦点移动到下一个字段,这不是预期的行为。这适用于Chrome 25、IE 9、Opera 12、Firefox 19和Safari 5。谢谢我添加图标就是为了使用这个解决方案。它保持选项卡顺序,而无需显式指定
. 谢谢有时tabindex等于nexttab的元素可能被隐藏或不可聚焦。您应该进行测试以确保$this可以获得焦点。
    $(".date").each(function() {
        $($(this).next('img')).wrap($("<A/>").attr("href","#"));
    });
$.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();
    }
});
$(".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) + ')')