选择后,Bootstrap datepicker返回焦点

时间:2015-01-27 14:24:29

标签: javascript jquery twitter-bootstrap datepicker bootstrap-datepicker

如果使用autoclose: true初始化bootstrap datepicker from eternicode,则会发生两种不良行为:

  1. 选择器关闭后,当您进入下一个字段时,您将再次从文档的开头开始。这在长形式上可能非常麻烦。
  2. 因为选择器以编程方式更改值,所以您关注输入上的blur事件的任何侦听器都不会正常运行。当您选择选择器值并且输入的值未更改时,实际上会出现模糊。然后bootstrap-datepicker以编程方式更新字段,因此永远不会使用新值触发模糊。
  3. 这是一个堆栈摘要中的演示
    *选择任何字段,从选择器中选择一个值,然后点击 Tab

    
    
    $(".datepicker").datepicker({
      autoclose: true
    });
    
    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>
    <link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.3.1/css/datepicker.css" rel="stylesheet"/>
    
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.3.1/js/bootstrap-datepicker.js"></script>
    
    
    <input type="text" class="datepicker" /><br/>
    <input type="text" class="datepicker" /><br/>
    <input type="text" class="datepicker" /><br/>
    &#13;
    &#13;
    &#13;

    根据Focus the field after selecting the jQuery UI datepicker的回答,您可以使用onCloseonSelect个事件,但bootstrap picker doesn't offer those events

    简单地用hide替换它们似乎也不起作用,因为重新聚焦将创建一个无限循环,在您尝试关闭它时始终保持选择器打开。

    $(".datepicker").datepicker({
      autoclose: true
    })
    .on('hide', function () {
      $(this).focus();
    });
    

    Stack Snippet Demo

    &#13;
    &#13;
    $(".datepicker").datepicker({
      autoclose: true
    })
    .on('hide', function () {
      $(this).focus();
    });
    &#13;
    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>
    <link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.3.1/css/datepicker.css" rel="stylesheet"/>
    
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.3.1/js/bootstrap-datepicker.js"></script>
    
    
    <input type="text" class="datepicker" /><br/>
    <input type="text" class="datepicker" /><br/>
    <input type="text" class="datepicker" /><br/>
    &#13;
    &#13;
    &#13;

3 个答案:

答案 0 :(得分:7)

这是一个黑客工作,但你可以有条件地隐藏和显示元素,以避免无限循环。在隐藏时,检查这是否是第一次尝试隐藏。如果输入没有焦点(意味着他们使用了下拉菜单并且我们已经丢失了我们的Tab键顺序,那么重新聚焦将导致选择器显示。我们也会抓住这个节目并从那里隐藏,返回我们的原始代码。我们会在对象上来回传递一个属性,以便我们可以管理状态。

这将是这样的:

$(".datepicker").datepicker({
  autoclose: true
})
.on('hide', function () {
  if (!this.firstHide) {
    if (!$(this).is(":focus")) {
      this.firstHide = true;
      // this will inadvertently call show (we're trying to hide!)
      this.focus(); 
    }
  } else {
    this.firstHide = false;
  }
})
.on('show', function () {
  if (this.firstHide) {
    // careful, we have an infinite loop!
    $(this).datepicker('hide'); 
  }
})

Stack Snippet Demo

&#13;
&#13;
$(".datepicker").datepicker({
  autoclose: true
})
.on('hide', function () {
  if (!this.firstHide) {
    if (!$(this).is(":focus")) {
      this.firstHide = true;
      // this will inadvertently call show (we're trying to hide!)
      this.focus(); 
    }
  } else {
    this.firstHide = false;
  }
})
.on('show', function () {
  if (this.firstHide) {
    // careful, we have an infinite loop!
    $(this).datepicker('hide'); 
  }
})
&#13;
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>
<link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.3.1/css/datepicker.css" rel="stylesheet"/>

<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.3.1/js/bootstrap-datepicker.js"></script>


<input type="text" class="datepicker" /><br/>
<input type="text" class="datepicker" /><br/>
<input type="text" class="datepicker" /><br/>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

使用@KyleMit解决方案添加的当前日期选定功能

&#13;
&#13;
var date = new Date();
  var today = new Date(date.getFullYear(), date.getMonth(), date.getDate());
  var end = new Date(date.getFullYear(), date.getMonth(), date.getDate());

$(".datepicker").datepicker({
  autoclose: true
})
.on('hide', function () {
  if (!this.firstHide) {
    if (!$(this).is(":focus")) {
      this.firstHide = true;
      // this will inadvertently call show (we're trying to hide!)
      this.focus(); 
    }
  } else {
    this.firstHide = false;
  }
})
.on('show', function () {
  if (this.firstHide) {
    // careful, we have an infinite loop!
    $(this).datepicker('hide'); 
  }
})
$('.datepicker').datepicker('setDate', today);
&#13;
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>
<link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.3.1/css/datepicker.css" rel="stylesheet"/>

<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.3.1/js/bootstrap-datepicker.js"></script>


<input type="text" class="datepicker" /><br/>
<input type="text" class="datepicker" /><br/>
<input type="text" class="datepicker" /><br/>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我正在努力实现同样的目标,但不知何故,解决方案是一个小小的车。例如,如果再次单击相同的日期选择器,则它没有响应。如果多次单击,浏览器将停止响应。我有一个更好的解决方案,如下所示。

我的解决方案是欺骗datepicker专注于DIV中的下一个元素。我有欧芹验证,它会自动为我添加<UL>

<div>   
<input type="text" class="datepicker" />
<ul class="error-message"></ul>
</div>

$('.datepicker').datepicker({
        autoclose: true
    }).on('hide', function () {
        $(this).next('ul').attr('tabindex',-1).focus();
    });