Bootstrap Datepicker - 禁用日期 - 多个日期选择器

时间:2013-10-04 05:13:44

标签: twitter-bootstrap datepicker

我正在为datepicker(http://www.eyecon.ro/bootstrap-datepicker/)使用bootstrap插件。 当您转到上面的链接时,会有一个代码示例,说明如何制作一个简单的登记签出表格。在结账日期选择器上,禁用登记日期选择器之前的所有日期。

在我的网站上有多个签到结帐表格(适用于多个房间)。每间客房均提供办理入住手续和退房日期(情侣)。所以我认为以下代码可以做到。

创建一个包含页面上所有日期选择器的数组(它可以是变量)。然后每对2循环遍历数组+应用代码。

if ($('.datepicker').length) { 
//get all the datepickers
var IDs = [];
$(".main").find(".datepicker").each(function(){ IDs.push(this.id); });

for(j=0;j<IDs.length;j++){
    var nowTemp = new Date();
        var now = new Date(nowTemp.getFullYear(), nowTemp.getMonth(), nowTemp.getDate(), 0, 0, 0, 0);

        var checkin = $('#'+ IDs[j]).datepicker({
        onRender: function(date) {
                 return date.valueOf() < now.valueOf() ? 'disabled' : '';
        }
        }).on('changeDate', function(ev) {
        var newDate = new Date(ev.date)
        newDate.setDate(newDate.getDate() + 1);
        checkout.setValue(newDate);
        checkin.hide();
        $('#'+ IDs[j+1])[0].focus();
        }).data('datepicker');

        var checkout = $('#'+ IDs[j+1]).datepicker({
        onRender: function(date) {
            return date.valueOf() <= checkin.date.valueOf() ? 'disabled' : '';
        }
        }).on('changeDate', function(ev) {
        checkout.hide();
        }).data('datepicker');
    j++;
    }
}

如果我在页面上有2个日期选择器,那么第二个就会按预期工作。第一个根本没有。如果我在页面上有1个日期选择器,那就可以了。

添加警报(ID)时,我会按照正确的顺序获得一个ID正确的数组。

如果有人可以提供帮助...... :)提前感谢!

1 个答案:

答案 0 :(得分:0)

我一直在研究这个问题并且认为如果有人在寻找,我会发布答案。

通过查找类'datepicker'的任何内容来工作。如果该项目的ID以“from”结尾,则会查找ID为“to”的相应项目。如果ID不以'from'或'to'结​​尾,则它会绑定普通的日期选择器。

我确信jquery guru可以做得更好; - )

外部JS:

function datepickerFromTo(fromSelector, toSelector, format) {
    var nowTemp = new Date();
    var now = new Date(nowTemp.getFullYear(), nowTemp.getMonth(), nowTemp.getDate(), 0, 0, 0, 0);

    var fromDate = $(fromSelector).datepicker({
        weekStart: 1,
        format: format,
        onRender: function (date) {
            return date.valueOf() < now.valueOf() ? 'disabled' : '';
        }
    }).on('show', function (ev) {
        toDate.hide();
    }).on('changeDate', function (ev) {
        if (ev.date.valueOf() > toDate.date.valueOf()) {
            var newDate = new Date(ev.date)
            newDate.setDate(newDate.getDate());
            toDate.setValue(newDate);
        }
        fromDate.hide();
        $(toSelector)[0].focus();
    }).data('datepicker');

    var toDate = $(toSelector).datepicker({
        weekStart: 1,
        format: format,
        onRender: function (date) {
            return date.valueOf() <= fromDate.date.valueOf() ? 'disabled' : '';
        }
    }).on('show', function (ev) {
        fromDate.hide();
    }).on('changeDate', function (ev) {
        toDate.hide();
    }).data('datepicker');
}

在页面底部:

<script>
$('.datepicker').each(function() {
    var thisId = $(this).attr("id");

    if(thisId.length >= 4 && thisId.substr(thisId.length - 4) == "from") { // The ID ends with 'from' - treat it as a 'from' date
        var idRoot = thisId.substr(0, thisId.length - 4);
        var toDateSelector = '#' + idRoot + 'to';
        var toDate = $(toDateSelector);
        if(toDate.length) { // Found a matching 'to date'
            datepickerFromTo('#' + thisId,toDateSelector,'dd/mm/yyyy');
        }
    } else if(!thisId.length >= 2 && thisId.substr(thisId.length - 2) == "to") { // Bind an ordinary datepicker. Exclude anything with ID ending with 'to' date as this is handled when binding 'from' date.
        $(this).datepicker({
            weekStart: 1,
            format: 'dd/mm/yyyy'
        });
    }
});
</script>