如何从另一个函数启动DatePicker的beforeShowDay



我有一个日期picker与以下代码。我有一个下拉框,在下拉框中进行更改时,我想启动datePicker beforeShowDay函数。我该怎么做呢?

var freeDate;

部分代码如下:

$("#myDiv").datepicker({
    showOtherMonths: true,
    selectOtherMonths: true,
    dateFormat: "yy/mm/dd",
    onSelect: function(dateText, inst) {},
    onChangeMonthYear: function(year, month, inst) {
        $.ajax({
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: '@Url.Action("ListDates", "Party")',
            data: {
                date: new Date(year, month - 1, 1).toString("yyyy/MM/dd"),
                userID: userID
            },
            success: function(data) {
                freeDate = eval(data);
            },
            error: function(request, status, error) {}
        });
    },
    beforeShowDay: function(dateToShow) {
        var returnResult = new Array();
        returnResult.push(true);
        var itemMatched = false;
        $.each(freeDate, function(key, value) {
            if (new Date(parseInt(value.substr(6))).compareTo(dateToShow) == 0) {
                itemMatched = true;
                returnResult.push('timeNotFree');
                return;
            }
        });
        if (!itemMatched) returnResult.push('');
        returnResult.push('');
        return returnResult;
    }
});​

$('#myList').change(function() {
    userID = $("#userList > option:selected").attr("value");
    // myList is used to have freeDate and the DatePicker must be shown accordingly.
    $.ajax({
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        url: '@Url.Action("ListDates", "Party")',
        data: {
            date: new Date($("#myDiv").datepicker("getDate").toString("yyyy/MM/dd")),
            userID: userID
        },
        success: function(data) {
            freeDate = eval(data);
        },
        error: function(request, status, error) {}
    });
    $("#myDiv").datepicker("setDate", $("#myDiv").datepicker("getDate").toString("yyyy/MM/dd"));
});​

beforeShowDay是由datepicker在呈现日期之前触发的事件。您可以使用它来自定义包含日期的单元格的显示方式,例如,您可以将其变为红色以指示阻塞日期。

从我对你的问题的理解来看,你可以调用datapicker.refresh()方法来指示freeDate变量已经改变(例如通过AJAX响应),并且需要再次呈现日历。

编辑

我相信这是你的下拉菜单的代码,似乎它使用ajax:

$('#myList').change(
...

在success回调中,您有:

freeDate = eval(data);

这是freeDate变化的地方,这可能是您应该调用.refresh()方法的地方。注意,AJAX在默认情况下是异步的,因此在选择值和成功事件回调之间会有一些延迟。

下面是你如何在一个已经存在的日期选择器上调用一个方法:

.
.
.
freeDate = eval(data);
$("#myDiv").datepicker("refresh");
.
.
.

我想说你应该在datepicker调用之外定义那个函数,然后你的更改和datepicker可以调用那个函数。

编辑:添加澄清。

试图弄清楚插件如何调用函数可能比它的价值更多的工作。您可以单独定义函数,然后将其传递给插件。然后你的下拉更改事件可以调用那个独立的方法。

像这样:

function doMyThing(dateToShow){
   // do stuff
}
$("#myDiv").datepicker({
    ...
    beforeShowDay: function(dateToShow){
        doMyThing(dateToShow);
    }
});  
$('#myList').change(function () {
    doMyThing(dateToShow);
});  

我唯一不确定的是你想在onchange中传递什么作为参数。因为它不是一个点击日期的动作,我不知道"dateToShow"应该是什么。

最新更新