多个链接的jQuery UI日期选择器

5
我希望能够链接多对jQuery UI日期选择器实例,使每对中的第二个日期选择器不能选择早于第一个日期选择器的日期。我正在按照这个示例开始操作。
示例:
<ul>
<li>
<input class="counter" name="counter" type="hidden" value="43"/>
<label>Start: </label><input name="start_43" id="start_43" size="10" />
<label>End: </label><input name="end_43" id="end_43" size="10" />
</li>

<li>
<input class="counter" name="counter" type="hidden" value="44"/>
<label>Start: </label><input name="start_44" id="start_44" size="10" />
<label>End: </label><input name="end_44" id="end_44" size="10" />
</li>
</ul>

我正在通过查找“counter”数字来循环实例:

$(document).ready(function() {
    var starts = $("input[name='counter']");
    var dates = new Array();
    starts.each(function(){
        var x = this.value;
        // http://jqueryui.com/demos/datepicker/#date-range
        dates[x] = $( "#start_"+x+", #end_"+x ).datepicker({
            onSelect: function( selectedDate ) {
            var option = this.id == "#start_"+x ? "minDate" : "maxDate",
            instance = $( this ).data( "datepicker" );
            date = $.datepicker.parseDate(
            instance.settings.dateFormat ||
            $.datepicker._defaults.dateFormat,
            selectedDate, instance.settings );
            dates[x].not( this ).datepicker( "option", option, date );
            }
        });
    });
});

这个代码可以在每个输入框上启用日期选择器,但它无法防止第二个实例在第一个实例之前选择日期。事实上,它要求第二个实例在第一个实例之前选择日期。当选择日期时,第二个实例会填充两个输入框!

有人能看出我哪里做错了吗?

2个回答

5

我不完全确定parseDate的作用,或者你为什么要从数据存储中检索实例。然而,我相信你的主要问题是this.id测试。在实际的DOM元素中,ID从不以#开头。

onSelect: function(selectedDate) {
    var option = this.id.indexOf("start_") != -1 ? "minDate" : "maxDate";
    dates[i].not(this).datepicker("option", option, selectedDate);
}

以上应该可以解决问题,或者你可以直接将代码中的哈希符号去掉(我刚刚试了一下,似乎也可以正常工作)。:]

@oleonard 为了明确起见,您只需要更改以下行,删除单词“start”前面的井号:var option = this.id == "start_"+x ? "minDate" : "maxDate"。 - lsuarez
啊,你说得完全正确!我没有意识到"#"偷偷溜进去了。现在它可以正常工作了。感谢你额外的帮助! - oleonard
@oleonard 我完全明白你的意思。我的团队领导盯着某个东西看了半个小时,当我建议他让我看看是否第二个人能帮助揭示问题时,问题迎刃而解。“我没有看到这个变量的范围。你是不是忘记打 's 点' 了?” - lsuarez

0
这个会起作用。
$("#FirstCal").datepicker({
        dateFormat: 'M d, yy',
        navigationAsDateFormat: true, prevText: 'M', nextText: 'M',
        changeMonth: true,
        changeYear: true,
        showOn: "both",
        showStatus: true,
        firstDay: 0,
        changeFirstDay: false,
        beforeShow: customRange,
        buttonImage: '/Content/images/Calendar_img.png',
        buttonImageOnly: true
    });

    $("#secondCal").datepicker({
        dateFormat: 'M d, yy',
        navigationAsDateFormat: true, prevText: 'M', nextText: 'M',
        changeMonth: true,
        changeYear: true,
        showOn: "both",
        showStatus: true,
        firstDay: 0,
        changeFirstDay: false,
        beforeShow: customRange,
        buttonImage: '/Content/images/Calendar_img.png',
        buttonImageOnly: true
    });

function customRange(input) {
    var min = new Date();
    var min = new Date('<%=DateTime.Now.Year %>', '0', '1');
    var max = new Date('<%=DateTime.Now.AddYears(1).Year %>', '11', '31');

    var dateMin = min;
    var dateMax = max;

    if (input.id == "firstCal" && $("#secondCal").datepicker("getDate") != null) {
        if (dateMin < min) {
            dateMin = min;
        }
    }
    else if (input.id == "secondCal") {
        if ($("#firstCal").datepicker("getDate") != null) {
            dateMin = $("#firstCal").datepicker("getDate");
        }
    }
    return {
        minDate: dateMin,
        maxDate: dateMax
    };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接