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

时间:2011-04-29 11:08:15

标签: jquery ajax jquery-ui date jquery-ui-datepicker

我有一个带有以下代码的Datepicker。我有一个下拉框,在dropDown框中发生更改后,我想启动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"));
});​

2 个答案:

答案 0 :(得分:8)

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

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

修改

我相信这是你的下拉列表的代码,好像它使用了ajax:

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

在成功回调中,你有:

freeDate = eval(data);

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

以下是在现有的datepicker上调用方法的方法:

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

答案 1 :(得分:1)

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

编辑:澄清补充。

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

这样的事情:

function doMyThing(dateToShow){
   // do stuff
}

$("#myDiv").datepicker({
    ...
    beforeShowDay: function(dateToShow){
        doMyThing(dateToShow);
    }
});  

$('#myList').change(function () {
    doMyThing(dateToShow);
});  

我唯一不确定的是你想要在onchange中作为参数传递的内容。由于这不是点击日期的动作,我不知道“dateToShow”应该是什么。