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

lea*_*ing 16 ajax jquery jquery-ui date jquery-ui-datepicker

我有一个带有以下代码的Datepicker.我有一个下拉框,在dropDown框中发生更改后,我想启动datePicker beforeShowDay函数.我怎样才能做到这一点?

var freeDate;
Run Code Online (Sandbox Code Playgroud)

我的部分代码如下:

$("#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;
    }
});?
Run Code Online (Sandbox Code Playgroud)
$('#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"));
});?
Run Code Online (Sandbox Code Playgroud)

Sal*_*n A 8

beforeShowDay是由一个日期选择器之前触发的事件当天被渲染.您可以使用它来自定义包含日期的单元格的显示方式,例如,您可以将其变为红色以指示阻止日期.

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

编辑

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

$('#myList').change(
...
Run Code Online (Sandbox Code Playgroud)

在成功回调中,您有:

freeDate = eval(data);
Run Code Online (Sandbox Code Playgroud)

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

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

.
.
.
freeDate = eval(data);
$("#myDiv").datepicker("refresh");
.
.
.
Run Code Online (Sandbox Code Playgroud)


Jam*_*gne 1

我想说你应该在日期选择器调用之外定义该函数,然后你的更改和日期选择器可以调用该函数。

编辑:添加了澄清。

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

像这样的东西:

function doMyThing(dateToShow){
   // do stuff
}

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

$('#myList').change(function () {
    doMyThing(dateToShow);
});  
Run Code Online (Sandbox Code Playgroud)

我唯一不确定的是您想要在 onchange 中作为参数传递什么。由于这不是单击日期的操作,因此我不知道“dateToShow”应该是什么。