javascript - 使用日期选择器关注下一个表单元素

标签 javascript jquery html css datepicker

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

$(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>

喜欢三毛

最佳答案

我稍微重新格式化了您的代码,因为关键的 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();
});

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

关于javascript - 使用日期选择器关注下一个表单元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41801218/

相关文章:

javascript - 单击触发按钮在“阅读更多”和“阅读更少”按钮中不起作用

javascript - 使用 jQuery 将焦点集中到表行中的 .next() td 文本框

html - 使用 css 和 HTML 的 streamlabs OBS 的简单文本删除效果

java - HTML 5 视频流 + Spring boot

javascript - 如何将目录中自动生成的文件列表添加到 JS 文件中?

基于2的倍数的Javascript切片数组

javascript - 从 AJAX 发送的数组中正确提取 bool 值

html - 父div需要重叠在子div上

javascript - 无法使 NgTable 与 AngularJs 1.5 一起工作

javascript - 单击标记时,Google map v3 打开最后一个信息窗口