【问题标题】:How to launch the beforeShowDay of DatePicker from another function如何从另一个函数启动 DatePicker 的 beforeShowDay
【发布时间】:2011-08-15 10:21:21
【问题描述】:

我有一个带有以下代码的日期选择器。我有一个下拉框,当下拉框发生变化时,我想在 ShowDay 之前启动 datePicker 函数。我该怎么做?

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"));
});​

【问题讨论】:

  • 上面的代码正确吗? onSelect 函数的右大括号被注释掉。此外,您将 data 提供给 $.ajax,但未将 type 指定为 POST,因此 jQuery 始终执行 GET 请求。
  • 根据我在答案 cmets 中的理解,您有一个 <select>,日期为 <option> 元素。选择 date 需要显示已设置月份的 datepicker 小部件。如果您为 <select> 和 datepicker <div> 提供 HTML 并提供 1 或 2 个示例,说明您希望 datepicker 在 <select> 中的给定日期显示什么日期,这将有助于理解。

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


【解决方案1】:

beforeShowDay 是 datepicker 在呈现 day 之前触发的事件。您可以使用它来自定义包含日期的单元格的显示方式,例如你可以把它变成红色来表示被阻止的日期。

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

编辑

我相信这是您的下拉菜单的代码,好像它使用了 ajax:

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

在成功回调中,你有:

freeDate = eval(data);

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

下面是在现有日期选择器上调用方法的方法:

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

【讨论】:

  • 我应该在哪里使用 datepicker.refresh,我可以举个例子
  • datePicker 在下拉列表中的值发生变化时不会被刷新
【解决方案2】:

我会说您可能应该在 datepicker 调用之外定义该函数,然后您的更改和 datepicker 可以调用该函数。

编辑:添加了说明。

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

类似这样的:

function doMyThing(dateToShow){
   // do stuff
}

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

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

我唯一不确定的是您希望在 onchange 中作为参数传递什么。由于它不是点击日期的动作,所以我不知道“dateToShow”应该是什么。

【讨论】:

  • 如何从下拉列表中调用 beforeShowDay: function(dateToShow)?
  • 即使我正在调用 doMyThing(dateToShow);在我的列表更改时,它不会调用 DatePicker 的 OnChange 函数!我需要从 myListChange 事件中调用 DatePicker 的 OnChange 事件
  • 也许如果您解释一下您实际使用此表单的内容,我会更好地理解。我相信在日历显示之前调用“beforeShowDay”,而不是 onChange。
  • 好的,让我解释一下。 DatePicker 显示在局部视图中,与 DatePicker 关联的所有函数都在局部视图中。加载页面后,将调用 DatePicker 函数。但是当我点击下拉菜单时,尽管有 setDate 函数,但似乎没有调用任何函数。
  • 但我的意思是,您正在寻找的实际功能是什么。这个下拉列表中有什么?选择下拉列表后,日期选择器会发生什么情况,是否应该根据所选内容填充某个日期?您能否提供这些事件中发生的情况(在ShowDay 之前等)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
相关资源
最近更新 更多