使用datepicker专注于下一个表单元素

时间:2017-01-23 07:32:30

标签: javascript jquery html css datepicker

我有一些表单元素(4),当我填充或选择当前元素时,它必须关注下一个元素,但我正在使用一些jquery插件jquery pikadayjquery flexdatalist 我的第一个输入有datalist, 第二和第三个元素有datepicker和 第四个元素有选择列表和我的问题如何在填充或选择时自动将下一个元素对焦?

$(document).ready(function() {
  
  $('.flexdatalist').flexdatalist({
       minLength: 0,
       searchContain:true,
  });

  $(document).on('focus', '.checkin, .checkout', function() {
    return new Pikaday({
      numberOfMonths: 2,
      field: this,
      format: "DD.MM.YYYY",
      minDate: new Date(),
      firstDay: 1,
      maxDate: new Date(2020, 12, 31),
      onSelect: function() {
        e = this.getDate();
      }
    });
  });
});
body {
  padding: 30px;
}
input,
select {
  width: 100%;
  padding: 10px;
  border: 1px solid #ccc;
}
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/css/pikaday.min.css" />
  <link rel="stylesheet" href="http://cdn.anitur.com.tr/example/flexdatalist/flexdatalist.css" />
</head>

<body>


  <div class="container">


    <div class="row">

      <div class="col-lg-3 col-md-3 col-sm-3">
        <input type="text" name="" class='flexdatalist' data-min-length='1' list='languages' name='language' />
        <datalist id="languages">
          <option value="PHP">PHP</option>
          <option value="JavaScript">JavaScript</option>
          <option value="Cobol">Cobol</option>
          <option value="C#">C#</option>
          <option value="C++">C++</option>
          <option value="Java">Java</option>
          <option value="Pascal">Pascal</option>
          <option value="FORTRAN">FORTRAN</option>
          <option value="Lisp">Lisp</option>
          <option value="Swift">Swift</option>
          <option value="ActionScript">ActionScript</option>
      </div>
      <div class="col-lg-3 col-md-3 col-sm-3">
        <input type="text" class="checkin" />
      </div>
      <div class="col-lg-3 col-md-3 col-sm-3">

        <input type="text" class="checkout" />
      </div>
      <div class="col-lg-3 col-md-3 col-sm-3">

        <select name="select" id="select">
          <option value="0">Choose</option>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          <option value="4">4</option>
          <option value="5">5</option>
          <option value="6">6</option>
          <option value="7">7</option>
        </select>
      </div>

    </div>


  </div>



  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/pikaday.min.js"></script>

  <script src="http://cdn.anitur.com.tr/example/flexdatalist/flexdatalist.js"></script>

  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>

</html>

喜欢trivago

1 个答案:

答案 0 :(得分:2)

我重新格式化了你的代码,因为关键的JS脚本位于底部。这仅适用于焦点上的pikadate框,我没有详细介绍flexdatalist。无论如何,你遇到的问题是,在每个日期选择器的焦点上你分配了新的,因此你会得到一个Maximum call stack size exceeded.('StackOverflow':)并不具有讽刺意味。因此,在文档就绪的这个示例中,每个插件分别分配给适当的框。另外,对于主要问题,在分配插件时,附加函数作为函数传递,该函数将说明如何在关闭此框之后选择下一个框。这是通过在分配插件时使用onClose属性来实现的。此外,如果您未在此处传递参数,则不会因为处理它而产生问题。

您现在可以对flexdatalist使用类似的方法,只需在插件文档中找到正确的属性(例如onClose上使用pikadate)。

<html lang="en">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/css/pikaday.min.css" />
  <link rel="stylesheet" href="http://cdn.anitur.com.tr/example/flexdatalist/flexdatalist.css" />
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/pikaday.min.js"></script>

  <script src="http://cdn.anitur.com.tr/example/flexdatalist/flexdatalist.js"></script>

    <script type="text/javascript">
        $(document).ready(function() {

            $('.flexdatalist').flexdatalist({
                minLength: 0,
                searchContain:true,
                select: function () {
                    $('#checkin').focus();
                }
            });

            var assignPicker = function (id, whenClosed) {
                if (typeof whenClosed !== 'function') {
                    whenClosed = null;
                }

                return new Pikaday({
                    numberOfMonths: 2,
                    field: document.getElementById(id),
                    format: "DD.MM.YYYY",
                    minDate: new Date(),
                    firstDay: 1,
                    maxDate: new Date(2020, 12, 31),
                    onSelect: function() {
                        e = this.getDate();
                    },
                    onClose: whenClosed
                });
            }

            assignPicker('checkin', function() {
                $('#checkout').focus();
            });
            assignPicker('checkout', function() {
                $('#select').focus();
            });

        });
    </script>

    <style>
        body {
            padding: 30px;
        }
        input,
        select {
            width: 100%;
            padding: 10px;
            border: 1px solid #ccc;
        }
    </style>

</head>

<body>


  <div class="container">


    <div class="row">

      <div class="col-lg-3 col-md-3 col-sm-3">
        <input type="text" name="" class='flexdatalist' data-min-length='1' list='languages' name='language' />
        <datalist id="languages">
          <option value="PHP">PHP</option>
          <option value="JavaScript">JavaScript</option>
          <option value="Cobol">Cobol</option>
          <option value="C#">C#</option>
          <option value="C++">C++</option>
          <option value="Java">Java</option>
          <option value="Pascal">Pascal</option>
          <option value="FORTRAN">FORTRAN</option>
          <option value="Lisp">Lisp</option>
          <option value="Swift">Swift</option>
          <option value="ActionScript">ActionScript</option>
        </datalist>
      </div>
      <div class="col-lg-3 col-md-3 col-sm-3">
          <input type="text" class="checkin" id="checkin" />
      </div>
      <div class="col-lg-3 col-md-3 col-sm-3">

          <input type="text" class="checkout" id="checkout" />
      </div>
      <div class="col-lg-3 col-md-3 col-sm-3">

        <select name="select" id="select">
          <option value="0">Choose</option>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          <option value="4">4</option>
          <option value="5">5</option>
          <option value="6">6</option>
          <option value="7">7</option>
        </select>
      </div>

    </div>


  </div>




  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>

</html>

编辑:这是flexdatalist框的一点更新。他们在官方documentation中有一些事件,但不确定其中任何事件都适合这种情况。

例如,您可以像这样使用change:flexdatalist

$('.flexdatalist').flexdatalist({
    minLength: 0,
    searchContain:true,
}).on('change:flexdatalist', function() {
    $('#checkin').focus();
});

但是,与任何其他可能适合您的事件一样,此处的问题是插件关闭的传播仅在这些事件发生后才会完成。然后你会在所有插件上得到一个链式关闭命令,因为它们在一系列事件中一个接一个地关闭。这里发生了什么,如果你试图在pikadate处理程序中放置焦点功能,那么onSelect插件上也会发生什么。 为了解决这个问题,我宁愿推荐使用另一个插件,它有一个on-close处理程序,只有在插件完成所有操作后才会传播(至少像pikadate那样)。另一种选择是扩展插件,这可能会更多一些工作。