10

我正在尝试使具体化日期选择器可编辑。这是目标,用户可以直接在输入字段中写入日期或使用小部件选择日期。

我做了一些即将在这个 jsfiddle上工作的事情。但是我正在尝试解决一个错误。当用户直接在输入中写入日期时,选择器也需要获取新值(因为我使用不同的格式提交日期并且有一个隐藏的输入字段要更新)。为了做到这一点,我试图做

picker.set('select', $(this.val());

但它会创建一个无限循环,因为setmaterialize 中的方法也会触发change输入事件。

编辑:哦,我刚刚发现在 github 上有一个关于该问题的问题。您对解决方法有任何想法吗?

4

1 回答 1

7

您想在更改方法中执行此操作的任何具体原因?
为什么不这样呢?

this.change(function(event) {

});

this.bind('blur keypress',function(e){
  if (moment($(this).val(), "DD/MM/YYYY", true).isValid()) {
      var inputFieldDate=getFmtDate($(this).val());
      picker.set('select',inputFieldDate);
  }

});

这是一个实用函数,用于解析DD/MM/YYY格式日期并获取 javascript Date对象

function getFmtDate(s){
  var valx=new Array();
  if(s!=null && s.length>0){
      valx = s.split('/');
  }
  var d = new Date(valx[2],valx[1]-1,valx[0]);
  return d;
}

这对我有用。

更新:

将小部件附加到 html 元素后,通常的事件回调函数将无法按您期望的方式工作。它们的功能被小部件覆盖。您不能以与以往相同的方式使用这些功能,并且必须找到解决方法。简而言之,您不能使用该change功能来设置或取消设置日期,因为设置会触发change事件。

在您的情况下,您想要解决多个非常常见的问题。您应该能够在线获得大量示例来实现其中的每一个。我所做的只是一种方法。

  1. 页面加载时以非传统方式填充表单。
  2. 页面加载时使用表单中的值初始化各种插件
  3. 在表单加载时初始化隐藏字段的内容,并在提交表单时更新隐藏字段。
  4. 按名称(隐藏字段的)获取值并使用它们来初始化小部件。


我过去blur keypress只是为了给你一个想法,你的所有需求都可以在不使用change. 您使用适合您的事件。picker您可以通过使用关键字绑定到calendar对象来设置日期,this并从其实例中访问它,如下所示。

    (function($) {

      $.fn.calendar = function(options) {

    // Options du datepicker
        var settings = $.extend({
            editable: true,
            format: 'dd/mm/yyyy',
            formatSubmit: 'ddmmyyyy'
        },
        options
      );

    this.pickadate(settings);
    //var picker = this.pickadate(''); will not work
    this.picker = this.pickadate('picker');

    this.change(function(event) {

    });
    this.bind('blur keypress',function(e){
      if (moment($(this).val(), "DD/MM/YYYY", true).isValid()) {
            var inputFieldDate=getFmtDate($(this).val());
          picker.set('select',inputFieldDate);
      }
    
    });

    var $triggerIcon = $('<div class="col s2 center-align"><a class="btn-floating btn-large waves-effect waves-light trigger-datepicker">Date</a></div>');
    $triggerIcon.click(function(event) {
      event.stopPropagation();
      event.preventDefault();
      picker.open();
    });
    this.parent().after($triggerIcon);
    // Resolves picker opening for thing
    this.next().unbind("focus.toOpen");
    return this;
      };
    }(jQuery));

设置日期:

//This is how you set a date
var cal = $('.datepicker').calendar();
//You can access picker because we changed
//var picker to
//this.picker above in fn.calendar
cal.picker.set('select', getFmtDate($("[name=hiddenDate]").val()));
// The syntax is 
//cal.picker.set('select', new Date());

$('#formulaireDate').validate();

您必须将日期转换为Date(). 下面的函数应该给你一个想法。您还可以使用jquery dateFormat插件等插件。

function getFmtDate(s){
    var valx=new Array();
      if(s!=null && s.length>0){
                        valx = s.split('/');
              }
  var d = new Date(valx[2],valx[1]-1,valx[0]);
  return d;
}

这是你的html。

<div class="row">
<div class="col s4">
  <input type="text" class="datepicker" />
  <input name="hiddenDate" type="hidden" value="12/12/2016">
</div>
</div>
于 2016-03-02T23:42:24.027 回答