JQuery Datepicker - 没有默认日期

时间:2010-09-08 13:44:50

标签: jquery jquery-ui datepicker

我想删除JQuery Datepicker中的默认日期。

我尝试以下代码:

$(this).datepicker({defaultDate: ''});

但它似乎不起作用。今天的日期仍被选为默认日期。

13 个答案:

答案 0 :(得分:9)

我使用隐藏的altField来解决问题:

<div id="DatePicker"></div>
<input type="hidden" value="" name="Date" id="Date" />

以及以下脚本:

<script>
    $(function () {

        $('#DatePicker').datepicker({
            altField: '#Date', // ID of the hidden field
            altFormat: 'dd/mm/yy'
        });

        // Remove the style for the default selected day (today)
        $('.ui-datepicker-current-day').removeClass('ui-datepicker-current-day');

        // Reset the current selected day
        $('#Date').val('');
    });
</script>

然后,我在验证例程中使用了隐藏的#Date字段。

答案 1 :(得分:8)

撰写本文时,没有一个答案真的对我有用,所以我的解决方案是从几个答案中拼凑出来的(对于内联日期选择器)。

    $('.calendar').datepicker("setDate", null); // this unsets the datepicker's internal selected date; it still shows a highlight on today's date that looks like a selected date though
    $('.calendar').find(".ui-datepicker-current-day").removeClass("ui-datepicker-current-day"); // this actually removes the highlight

答案 2 :(得分:6)

这实际上是 jQuery UI Datepicker 的一个开放性问题。这是问题的门票:

Ticket 8159

此问题的核心是 Datepicker 错误地处理 null defaultDate 值。在这里提供的解决方案中,我最喜欢j-polfer的解决方案,并因此推崇它。但是,此解决方案的工作原因是因为 setDate 方法中内置了一个补丁,用于在 null 传递给date参数时清除选择。但是我想找出为什么 Datepicker没有正确响应选项中的 defaultDate:null ,所以我看了一下源代码。

我发现我需要对 Datepicker 源代码进行三次更改才能解决此问题。以下是我所做的更改:

  1. defaultDate 选项为null或缺失时, _getDefaultDate 方法返回当前日期(这是问题的核心)。
  2. 我改变了这个方法...

        _getDefaultDate: function(inst) {
            return this._restrictMinMax(inst,this._determineDate(inst,this._get(inst, "defaultDate"), new Date()));
        }
    

    到此......

    _getDefaultDate: function(inst) {
        var def = this._get(inst, "defaultDate");
        return def !== null ? this._restrictMinMax(inst, this._determineDate(inst, def , new Date())): null;
    },
    
    1. 方法 _setDate 将所选日期设置为当null传递到date参数时的当前日期。我改为行来纠正这个:
    2. 我改变了这一行......

      inst.selectedDay = inst.currentDay = newDate.getDate();
      

      为...

      inst.selectedDay = date == null? 0: inst.currentDay = newDate.getDate();
      

      和这一行...

      this._adjustInstDate(inst);
      

      为...

      if (date != null) {
          this._adjustInstDate(inst);
      }
      
      1. 最后, _generateHTML 方法没有处理来自 _getDefaultDate 的返回值null。
      2. 所以我改变了这一行......

            (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
        

        为...

        (defaultDate != null && (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime())) ?
        

        就是这样。现在, Datepicker defaultDate 选项可以更直观地响应传入的 null 值,或者忽略此选项。

        $('#test').datepicker({ altField: '#alt'});  // No date selected
        $('#test').datepicker({ altField: '#alt', defaultDate: null});  // No date selected
        $('#test').datepicker({ altField: '#alt', defaultDate: 0});  // Today selected
        $('#test').datepicker({ altField: '#alt', defaultDate: +1});  // Tomorrow selected
        $('#test').datepicker({ altField: '#alt', defaultDate: -1});  // Yesterday selected
        

        以下是 JSFIDDLE 中的演示:Datepicker demo with defaultDate null

        请注意:这些更改尚未经过详尽的测试,因此_getDefaultDate方法现在可能会返回null,因此可能会出现其他问题。所以先做自己的测试吧! ;)

        希望这有助于某人! :)

答案 3 :(得分:5)

根据此处发布的答案,我设法制作出有效的方法。为了我的目的,我有一个始终可见的日历。如果您需要弹出日历,则应该能够使用现有的onSelect处理程序在第一次打开时执行类似的操作。

$("selector").datepicker(/* options */).find(".ui-state-active").removeClass("ui-state-active");

值得庆幸的是,使用最新版本的jQuery UI(撰写本文时为1.10.2)非常简单。它似乎不会干扰小部件的正确运行。唯一需要注意的是,使用getDate getter会产生通常默认的选定日期。

出于我的代码的目的,这是可以接受的,因为我的用户无法继续(他们甚至没有继续按钮),直到他们从选择器点击了有效日期。如果您不是这种情况,Florian Peschka's answer之类的内容可以满足您的需求。

答案 4 :(得分:3)

要打开日期选择器对话框,必须在某年的某个月打开它。我的意思是,你想显示这个对话框并且是空白的吗?...

我认为如果您不想传递任何默认日期,您可以做的最好的事情是获取当前日期:

$(document).ready(function() {
  $('#datepicker').datepicker();
});

传递此方法将失败,因为给定的defaultDate,不是null但是空白

$(this).datepicker({defaultDate: ''});

这可以完成前面代码中的预期工作

$(this).datepicker({defaultDate: null});

但它的行为与此答案中的第一个代码块相同。

答案 5 :(得分:2)

我使用内联 datepicker也有同样的问题。 插件在今天的cell / td上添加了类.ui-datepicker-current-day和.ui-state-active。我的解决方案是使用自定义类,如.ui-datepicker-selected-day,并实现beforeShowDay来处理您自己所选日期的显示。这样的事情:

$("datepicker").datepicker({
  beforeShowDay: function(date) {
  var dateIso = $.datepicker.formatDate("yy-mm-dd", date);
  var dateSelected = $("input").val();
  var classDate = "";
  if(dateSelected === dateIso){
    return [false,"ui-datepicker-selected-day"];
  }else{
    return [true];
  }
}

放入“突出显示”单元格的css示例:

.ui-widget-content .ui-datepicker-selected-day .ui-state-active{
  background-color: red;
}
+ disable some css from the plugin

答案 6 :(得分:1)

我使用$('.datefield').val('')显示空白而不显示默认日期。

答案 7 :(得分:1)

我知道这是一个老问题,我发现它是因为我有同样的要求;不要在输入(文本框)中显示日期,让用户从日期选择器中选择一个日期。

标记(MVC)

<div class="leftContent">
     @Html.TextBox("DateShipOn", Nothing, New With {.class = "DateShipOn", .readonly = "readonly"})
</div>

HTML输出:

<div class="leftContent">
    <input id="DateShipOn" class="DateShipOn hasDatepicker" type="text" value="" readonly="readonly" name="DateShipOn">
</div>

脚本(文档就绪):

$('.DateShipOn').datepicker({
    constrainInput: true,
    display: true,
    border: true,
    background: true,
    maxDate: "+1m",
    minDate: new Date('@minDate')
});

$('.DateShipOn').datepicker("setDate", new Date());

上面代码的效果是输入框中显示了'minDate'变量的值,当点击输入时,datepicker下拉,默认选择'minDate'。

注意:我们不允许手动输入,这就是'readonly'属性的原因。

解决:

在我的情况下,我所要做的就是评论/删除这一行:

$('.DateShipOn').datepicker("setDate", new Date());

结果:

效果就是显示;

  • 输入(文本框)
  • 中没有默认日期值
  • 用户无法输入输入(文本框)
  • 日期选择器下降,未选择默认日期
  • minDate会阻止选择minDate值之前的日期
  • maxDate可防止选择maxDate值后的日期

注意:根据我的要求,maxDate的'+ 1m'将日期选择限制为minDate值的30天。

希望这可以帮助别人。

答案 8 :(得分:0)

我有类似的问题,但有特定的行为。

(作为旁注,我认为预期的行为应该是从日历中的当前日期开始,但选择它。)

我的实施包括一个隐藏输入altField的内联日历。我所做的是删除altField选项,并添加一个更新它的onSelect函数。这样,今天的日期仍然看起来被选中,但代表真实值的隐藏字段保持为空。

答案 9 :(得分:0)

我的解决方案涉及覆盖jQuery的追加,以便我们可以在每次重新生成HTML并将其附加到div时删除元素。这样可以在切换月份时修复默认日期的闪烁,并且还可以清除悬停。

(function($) {
    var origAppend = $.fn.append;

    $.fn.append = function () {
        return origAppend.apply(this, arguments).trigger("append");
    };
})(jQuery);

var datePickerDiv = $("#date-picker");
datePickerDiv.bind("append", function() {
  $(this).find(".ui-datepicker-days-cell-over").removeClass("ui-datepicker-days-cell-over");
  $(this).find(".ui-datepicker-today a ").removeClass("ui-state-highlight ui-state-active ui-state-hover");
});

datePickerDiv.datepicker();

答案 10 :(得分:0)

适合我:

$(document).ready(function() {
    $("#datepicker .ui-state-active").removeClass("ui-state-active");
    $("#datepicker .ui-state-highlight").removeClass("ui-state-highlight");
    $("#datepicker .ui-datepicker-today").removeClass("ui-datepicker-today");
});

答案 11 :(得分:0)

您也可以像这样放置空值:

  $(this).datepicker({defaultDate: null});

答案 12 :(得分:-2)

想要“删除”默认日期是什么意思?

你认为当没有月份开始时,日期选择器会打开吗?!您 拥有默认日期。

修改您的评论

根据需要设置默认日期,如果用户已更改,请检查。如果是这样,他选择了一个自定义日期。

另一种方法是在用户点击datepicker字段时创建一个设置为true的变量。

如果用户提交表单,则检查该变量。如果是true,则用户选择了日期。如果没有,他没有触及datepicker字段。