在bootstrap datepicker中禁用月份

时间:2015-08-18 21:04:59

标签: jquery twitter-bootstrap datepicker

我正在尝试使用选项datesDisabled禁用日期选择器中的月份。根据文档,它应该通过以我用于datepicker的格式传递一个字符串数组来工作,但我无法使它工作。

HTML:

<div class="modal-body">
 <div class="input-append date" id="datepicker1" data-date="Aug-2015" data-date-format="mm-yyyy" data-dates-disabled="Sep-2015,Oct-2015" style="display:inline-block; font-weight:bold;">
  Check In: <input  type="text" readonly="readonly" name="date1" >
  <span class="add-on"><i class="glyphicon glyphicon-calendar"></i></span>      
 </div>       
</div>  

使用Javascript:

var dateStart = new Date();
dateStart.setDate(dateStart.getDate()-1);

$( document ).ready(function() {
    var dp = document.getElementById("datepicker1");

    $("#datepicker1").datepicker( {
        format: "mm-yyyy",
        startView: "months", 
        minViewMode: "months",
        startDate: dateStart,
        datesDisabled: dp.dataset.datesDisabled.split()
    }).datepicker("setDate",null);

});

更新

看起来这不会得到回答所以我决定尝试通过查找所有月份并将其更改为已禁用的课程来完成此操作。问题是我无法检测到能够获得当前日历年份的点击次数。

datepicker标题的HTML:

  <tr>
   <th style="visibility: hidden;" class="prev">«</th>
   <th colspan="5" class="datepicker-switch">2015</th>
   <th style="visibility: visible;" class="next">»</th>
  </tr>

使用Javascript:

$("th.next:first").click(function(){
    var currentYear = $("th.datepicker-switch:first").html();
    console.log("current year is " + currentYear); // nothing happens here
});

检测日期选择器内部元素点击的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

在datepicker插件datesDisabled中只使用日期,而不是月。检查以下代码

if (this.o.datesDisabled.length > 0 && $.grep(this.o.datesDisabled, function(d){ return isUTCEquals(date, d); }).length > 0) { cls.push('disabled', 'disabled-date'); }

因此,如果您以sep-2015格式传递一个月,则函数isUTCEquals将返回false。所以几个月不会被禁用 上面的代码出现在下面的JS中。

最新版本JS - &gt; http://eternicode.github.io/bootstrap-datepicker/bootstrap-datepicker/js/bootstrap-datepicker.js

检测datepicker内的点击次数

此插件中有一些事件 - &gt; http://bootstrap-datepicker.readthedocs.org/en/stable/events.html#events

例如:changeMonth事件。

$("#datepicker1").on('changeMonth',function(date){ console.log(date.date.getMonth()+1); }) });

更新了小提琴http://jsfiddle.net/santoshj/z2v31Leo/3/

答案 1 :(得分:0)

您可以使用datepicker的show事件来停用不可用的月份:

var datesToDisable = $('#datepicker1').data("datesDisabled").split(',');
  // or...
  // var datesToDisable = ["Sep-2015", "Oct-2015"];

//var dateStart = new Date();
//dateStart.setDate(dateStart.getDate()-1);

$('#datepicker1').datepicker({
        format: "mm-yyyy",
        startView: "months", 
        minViewMode: "months",
        //startDate: dateStart
        //datesDisabled: dp.dataset.datesDisabled.split()
    }).on("show", function(event) {

  var year = $("th.datepicker-switch").eq(1).text();  // there are 3 matches

  $(".month").each(function(index, element) {
    var el = $(element);

    var hideMonth = $.grep( datesToDisable, function( n, i ) {
                  return n.substr(4, 4) == year && n.substr(0, 3) == el.text();
                });

    if (hideMonth.length)
      el.addClass('disabled');

/* To hide those months completely...
    if (hideMonth.length)
      el.hide();
*/
  });
});

以下是一个例子:https://jsfiddle.net/zadaey92/1/

答案 2 :(得分:0)

发生了类似的问题以禁用月份,并使用beforeShowMonth选项找到了更短的解决方案:

var monthsToDisable = ['2019-09'];
$('#datepicker').datepicker({
    format: "yyyy-mm",
    startView: "months", 
    minViewMode: "months",
    beforeShowMonth: function(date) {
        var formattedDate = moment(date).format('YYYY-MM');
        return $.inArray(formattedDate, monthsToDisable) < 0;
    }
);