【问题标题】:Detect change to selected date with bootstrap-datepicker使用 bootstrap-datepicker 检测对选定日期的更改
【发布时间】:2013-06-05 06:01:53
【问题描述】:

我有一个使用bootstrap-datepicker 创建的带有附加日期选择器的输入元素。

<div class="well">
    <div class="input-append date" id="dp3" data-date="2012-01-02" data-date-format="yyyy-mm-dd">
        <input type="text" id="date-daily">
        <span class="add-on"><i class="icon-th"></i></span>    
    </div>
</div>

<script language="JavaScript" type="text/javascript">
    $(document).ready(function() {
        $('#dp3').datepicker();
        $('#date-daily').val('0000-00-00');
        $('#date-daily').change(function () {
            console.log($('#date-daily').val());
        });
    });
</script>

当用户通过直接在输入元素中输入更改日期时,我可以通过输入元素的onChange事件获取值,如上图所示。但是当用户从 datepicker 更改日期(即通过单击日历上的日期)时,不会调用 onChange 处理程序。

如何检测通过日期选择器而不是在输入元素中输入对所选日期所做的更改?

【问题讨论】:

    标签: jquery twitter-bootstrap datepicker bootstrap-datepicker


    【解决方案1】:

    所有其他答案都与jQuery UI datepicker有关,但问题与bootstrap-datepicker有关。

    您可以使用changeDate 事件在相关输入上触发更改事件,然后从onChange 处理程序处理更改日期的两种方式:

    更改日期

    日期更改时触发。

    例子:

    $('#dp3').datepicker().on('changeDate', function (ev) {
        $('#date-daily').change();
    });
    $('#date-daily').val('0000-00-00');
    $('#date-daily').change(function () {
        console.log($('#date-daily').val());
    });
    

    这是一个有效的小提琴:http://jsfiddle.net/IrvinDominin/frjhgpn8/

    【讨论】:

    • 还有一个clearDate 事件你应该听,如果你的日期是空的。但是,通过上下文菜单(在 Chrome 中)清除时,似乎不会触发此事件。
    • 通过代码更改输入值后是否可以触发事件?
    • 由于外部资源,小提琴不再起作用。此处更新版本:jsfiddle.net/jsrq4ot0/2
    • 对于 bootstrap-datetimepicker,事件名称是 dp.change
    • 查看 bootstrap-datepicker 事件文档bootstrap-datepicker.readthedocs.io/en/latest/events.html
    【解决方案2】:

    试试这个:

    $("#dp3").on("dp.change", function(e) {
        alert('hey');
    });
    

    【讨论】:

    • 这就是从文档中完成的方式。也为了节省时间 - e 拥有像 e["date"] 和 e["oldDate"] 这样的属性
    • 问题是关于 bootstrap-datepicker 而不是 bootstrap-datetimepicker
    • 唯一对我有用的答案!干杯
    【解决方案3】:

    这是我的代码:

    $('#date-daily').datepicker().on('changeDate', function(e) {
        //$('#other-input').val(e.format(0,"dd/mm/yyyy"));
        //alert(e.date);
        //alert(e.format(0,"dd/mm/yyyy"));
        //console.log(e.date); 
    });
    

    只需取消注释您喜欢的那个。 第一个选项更改其他输入元素的值。 第二个使用 datepicker 默认格式提醒日期。 第三个使用您自己的自定义格式提醒日期。 最后一个选项输出到日志(默认格式日期)。

    您可以选择使用 e.date 、 e.dates(用于多个日期输入)或 e.format(...)。

    这里some more info

    【讨论】:

      【解决方案4】:

      $(function() {
        $('input[name="datetimepicker"]').datetimepicker({
          defaultDate: new Date()
        }).on('dp.change',function(event){
          $('#newDateSpan').html("New Date: " + event.date.format('lll'));
          $('#oldDateSpan').html("Old Date: " + event.oldDate.format('lll'));
        });
        
      });
      <link href="http://cdn.rawgit.com/Eonasdan/bootstrap-datetimepicker/e8bddc60e73c1ec2475f827be36e1957af72e2ea/build/css/bootstrap-datetimepicker.css" rel="stylesheet"/>
      <link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"/>
      
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <script src="http://momentjs.com/downloads/moment.min.js"></script>
      <script src="http://getbootstrap.com/dist/js/bootstrap.min.js"></script>
      <script src="http://cdn.rawgit.com/Eonasdan/bootstrap-datetimepicker/e8bddc60e73c1ec2475f827be36e1957af72e2ea/src/js/bootstrap-datetimepicker.js"></script>
      
      <div class="container">
        <div class="col-xs-12">
          <input name="datetimepicker" />
          <p><span id="newDateSpan"></span><br><span id="oldDateSpan"></span></p>
        </div>
      </div>

      【讨论】:

      • edit 提供更多信息。纯代码和“试试这个”的答案是discouraged,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。我们在这里努力成为知识的资源。
      • 如果您已将当前日期设置为文本框,这将非常有效。如果您设置了当前日期,则 dp.onchange 将在页面加载时触发。
      【解决方案5】:
      $(document).ready(function(){
      
      $("#dateFrom").datepicker({
          todayBtn:  1,
          autoclose: true,
      }).on('changeDate', function (selected) {
          var minDate = new Date(selected.date.valueOf());
          $('#dateTo').datepicker('setStartDate', minDate);
      });
      
      $("#dateTo").datepicker({
          todayBtn:  1,
          autoclose: true,}) ;
      
      });
      

      【讨论】:

        【解决方案6】:

        试试下面的代码示例。它对我有用

        var date_input_field = $('input[name="date"]');
            date_input_field .datepicker({
                dateFormat: '/dd/mm/yyyy',
                container: container,
                todayHighlight: true,
                autoclose: true,
            }).on('change', function(selected){
                alert("startDate..."+selected.timeStamp);
            });
        

        【讨论】:

          【解决方案7】:

          基于 Irvin Dominin 示例,我创建了 2 个支持粘贴并按 Enter 的示例。

          这适用于 Chrome: http://jsfiddle.net/lhernand/0a8woLev/

          $(document).ready(function() {
             $('#date-daily').datepicker({
                format: 'dd/mm/yyyy',
                assumeNearbyYear: true,
                autoclose: true,
                orientation: 'bottom right',
                todayHighlight: true,
                keyboardNavigation: false
              })
              /* On 'paste' -> loses focus, hide calendar and trigger 'change' */
              .on('paste', function(e) {
                $(this).blur();
                $('#date-daily').datepicker('hide');
              })
              /* On 'enter' keypress -> loses focus and trigger 'change' */
              .on('keydown', function(e) {
          
                if (e.which === 13) {
                   console.log('enter');
                   $(this).blur();
                }
              })
              .change(function(e) {
                console.log('change');
                $('#stdout').append($('#date-daily').val() + ' change\n');
              });
          });
          

          但不是在 IE 中,所以我为 IE11 创建了另一个示例: https://jsbin.com/timarum/14/edit?html,js,console,output

          $(document).ready(function() {
             $('#date-daily').datepicker({
                format: 'dd/mm/yyyy',
                assumeNearbyYear: true,
                autoclose: true,
                orientation: 'bottom right',
                todayHighlight: true,
                keyboardNavigation: false
              })
              // OnEnter -> lose focus
              .on('keydown', function(e) {
                   if (e.which === 13){ 
                     $(this).blur();
                   }
              })
              // onPaste -> hide and lose focus
              .on('keyup', function(e) {
                   if (e.which === 86){ 
                      $(this).blur();
                      $(this).datepicker('hide');
                    }
              })
              .change(function(e) {
                 $('#stdout').append($('#date-daily').val() + ' change\n');
              });
          });
          

          如果最后一个示例在 IE11 中仍然无法运行,您可以尝试拆分设置:

          // DatePicker setup
          $('.datepicker').datepicker({
              format: 'dd/mm/yyyy',
              assumeNearbyYear: true,      /* manually-entered dates with two-digit years, such as '5/1/15', will be parsed as '2015', not '15' */
              autoclose: true,             /* close the datepicker immediately when a date is selected */
              orientation: 'bottom rigth',
              todayHighlight: true,        /* today appears with a blue box */
              keyboardNavigation: false    /* select date only onClick. when true, is too difficult free typing  */
          }); 
          

          还有事件处理程序:(注意我没有使用$('.datepicker').datepicker({

             // Smoker DataPicker behaviour
              $('#inputStoppedDate')
              // OnEnter -> lose focus
              .on('keydown', function (e) {
                  if (e.which === 13){ 
                      $(this).blur();
                  }
              })
              // onPaste -> hide and lose focus
              .on('keyup', function (e) {
                  if (e.which === 86){ 
                      $(this).blur();
                      $(this).datepicker('hide');
                  }
              })
              .change(function (e) {
                  // do saomething
              });
          

          【讨论】:

            【解决方案8】:

            你可以使用onSelect事件

             $("#date-daily").datepicker({
              onSelect: function(dateText) {
               alert($('#dp3').val());
              }
            });
            

            选择日期选择器时调用。该函数接收 选择日期作为文本,日期选择器实例作为参数。这 指关联的输入字段。

            SEE HERE

            【讨论】:

            • 您的答案描述了如何解决 jquery datepicker 中的问题,但是 OP 询问的是 bootstrap-datepicker 这是一个不同的组件(尽管设计用于相同的目的)。换句话说,你的答案是错误的。
            • 这不是提到的正确日期选择器,马克的答案是正确的
            猜你喜欢
            • 1970-01-01
            • 2015-11-29
            • 2016-11-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-21
            相关资源
            最近更新 更多