【问题标题】:jQuery + Boostrap DatePicker: How to have two datepicker inputs update each other?jQuery + Bootstrap DatePicker:如何让两个日期选择器输入相互更新?
【发布时间】:2014-12-23 18:30:57
【问题描述】:

我在一个项目中使用this Bootstrap Datepicker 工具,并且我有两个日期选择器字段。我需要它,以便当您在其中选择一个日期时,它将另一个更新为相同的日期。

<input class="datepicker" type="text" id="date1">
<input class="datepicker" type="text" id="date2">

<script>
  $("#date1").datepicker();
  $("#date2").datepicker();
</script>

这里有一些 jQuery 来更新它:

$("#date1").change(function() {
  var value = $(this).val();
  $("#date2").datepicker("update", value);
});

$("#date2").change(function() {
  var value = $(this).val();
  $("#date1").datepicker("update", value);
});

但是,datepicker('update', value) 函数会导致change 事件再次触发,从而导致无限循环。拥有此功能的正确/正确方法是什么?

【问题讨论】:

    标签: javascript jquery html bootstrap-datepicker


    【解决方案1】:

    我想出了这个解决方案:

    var update1 = false;
    var update2 = false;
    
    $("#date1").change(function() {
      var value = $(this).val();
      if (!update1) {
        update2 = true;
        $("#date2").datepicker("update", value);
      }
    
      update1 = false;
    });
    
    $("#date2").change(function() {
      var value = $(this).val();
      if (!update2) {
        update1 = true;
        $("#date1").datepicker("update", value);
      }
    
      update2 = false;
    });
    

    这是我想要的,但我不确定这是否是正确/最好的方法。

    【讨论】:

    • 看起来你有这个日期选择器库的最佳解决方案。
    【解决方案2】:

    我发现更改事件有问题。我所做的是使用 .on 代替。

    $('#datepicker2').datepicker('setDate', dateToday);
    $('#datepicker2').datepicker().on('changeDate', function (e) {
        toDate = $('#datepicker2').val().toString();
        if (toDate < fromDate) {
            fromDate = (new Date(toDate).getMonth() + 1) + "/01/" + new  Date(toDate).getFullYear();
            $('#datepicker1').datepicker('setDate', fromDate);
        }
          });
    

    【讨论】:

      【解决方案3】:

      是的,显然bootstrap-datepicker 存在很大的递归问题,这不会影响 jQuery UI Datepicker。以下代码有效并防止递归,但changeDate 事件仍会触发 3 或 4 次。

      function datePickerInit(sel) {
        sel = $(sel);
        $(sel).each(function() {
          $(this).datepicker().on("change", function() {
            console.log("change date");
            sel.datepicker("remove");
            sel.siblings(".datepicker").val($(this).val());
            setTimeout(function() {
              datePickerInit(".datepicker");
            }, 100);
          });
        });
      }
      $(document).ready(function() {
        datePickerInit(".datepicker");
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
      <script src="http://eternicode.github.io/bootstrap-datepicker/bootstrap-datepicker/js/bootstrap-datepicker.js"></script>
      <input class="datepicker" type="text" id="date1">
      <input class="datepicker" type="text" id="date2">

      【讨论】:

      • 但问题是,当#date2 发生变化时,我还需要#date1 进行更新。
      • 使用val() 更新的问题在于,它实际上并没有更新日期选择器的值,只是更新了字段中的文本。
      • 确实如此。如果您在以编程方式更改后单击更新的日期输入,则所选日期将是另一个日期输入中设置的日期。
      • 啊,我明白了。这似乎适用于 JQuery UI Datepicker,但不适用于我链接的 Bootstrap Datepicker。
      • 刚刚更新了我的方法,但你是对的,bootstrap-datepicker 似乎存在递归问题。我尝试在更改时删除 datepicker,但 changeDate 事件仍会触发 3 或 4 次,因此使用函数外部变量的方法实际上可能会更好,毕竟 :-)
      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多