javascript - jQuery datePicker 中的奇怪行为

标签 javascript jquery jquery-ui jquery-ui-datepicker

好吧,这有点奇怪,我很惊讶。我想知道是否有人知道这是预期的行为还是某些错误。

在 ASP.NET MVC 应用程序上,我将 jQuery 用于客户端事件。我有几个日期选择器,我尝试通过在日期选择器对象上使用 onSelect 属性来覆盖点击事件上的标准日颜色模式。

基本上,在 onSelect 上,我使用 AJAX 调用向服务器询问我想要以确定的颜色显示的日期并更改它们(通常在将点击的日期添加到“标记”日期列表之后)。

我的代码似乎并没有覆盖默认行为(当你点击某一天时,整天都会获得标准颜色并且你点击的那一天被突出显示),它似乎在它之后执行(因此重绘状态和颜色在我想要的日期选择器上)。

令我惊讶的是,如果我使用 $.ajax 调用服务器,我的代码会在显示标准颜色模式的“默认行为”之前执行,但如果我使用 $.post,我的代码会在显示标准颜色模式之后执行覆盖标准颜色模式的“默认行为”。

下面是一些代码示例:

$("#diasNoLectivosHolder").datepicker({ 
    minDate: arrayNoLaborables[0], 
    maxDate: arrayNoLaborables[1],
    onSelect: function (fecha, calendar, event) {
        $.post($.url("Grupos/diaNoLaborable/" + $("#idGrupo").val() + "/" + fecha.replace(/\//g, ".")), function (xmlResponse) {
            if (xmlResponse)
                $.post($.url("Grupos/obtenerDiasNoLaborables/" + $("#idGrupo").val()), function (xmlDias) {
                    marcarNoLaborables(xmlDias);
                });
            $("#fechaInicio").change();
            return false;
        });
        return false;
    },
    onChangeMonthYear: function () {
        $.post($.url("Grupos/obtenerDiasNoLaborables/" + $("#idGrupo").val()), function (xmlResponse) { marcarNoLaborables(xmlResponse); });
    }
});

在这个例子中,点击任何一天后,日历会短暂闪烁到标准颜色模式,并完成显示我的 marcarNoLaborables(xmlDias); 的颜色模式。方法定义。

相反,如果我使用:

$("#diasNoLectivosHolder").datepicker({ 
    minDate: arrayNoLaborables[0], 
    maxDate: arrayNoLaborables[1],
    onSelect: function (fecha, calendar, event) {
        $.ajax({ 
            async: false,
            cache: false,
            url: $.url("Grupos/diaNoLaborable/" + $("#idGrupo").val() + "/" + fecha.replace(/\//g, ".")),
            success: function (xmlResponse) {
                if (xmlResponse)
                    $.ajax({ 
                        async: false,
                        cache: false,
                        url: $.url("Grupos/obtenerDiasNoLaborables/" + $("#idGrupo").val()),
                        success: function (xmlDias) {
                            marcarNoLaborables(xmlDias);
                        }
                    });
                $("#fechaInicio").change();
                return false;
            }
        });
        return false;
    },
    onChangeMonthYear: function () {
        $.post($.url("Grupos/obtenerDiasNoLaborables/" + $("#idGrupo").val()), function (xmlResponse) { marcarNoLaborables(xmlResponse); });
    }
});

日期选择器,在任何一天点击后,完成绘制“标准颜色模式”,如果我执行代码,我可以看到我修改的颜色模式适用,但在完成我的代码时,标准模式适用。

所以我的问题是...有人知道为什么 $.ajax 或 $.post 的使用会影响执行代码时遵守“默认日期选择器行为”的时刻吗?

如有任何我的解释不清楚的地方,请随时提出。英语不是我的母语,有时我发现很难解释清楚这样复杂的情况。

谢谢大家

最佳答案

代码在脚本中的不同点执行的原因是因为设置了“异步”选项。

默认情况下,“async”选项设置为 true,这意味着在生成 XHR 时不会阻止代码执行。通常这是需要的行为,因为您不希望在脚本调用服务器以获取更多数据时阻塞 UI 线程。

将“async”选项设置为 false 更改行为,以便您的脚本暂停,直到服务器做出响应。

我不确定您脚本的最终目标是什么,因此我无法就您应该做什么提出建议。但是您应该知道 $.post 方法只是 $.ajax 方法的简写,具有以下选项:

$.ajax({
  type: "POST",
  url: url,
  data: data,
  success: success,
  dataType: dataType
});

因此,如果您的同步的阻塞行为是绝对需要的(不推荐),您可以获得一个“POST”类型的 AJAX 请求,其中包含传递给 $.ajax 的相同选项。

希望这对您有所帮助。

关于javascript - jQuery datePicker 中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15831070/

相关文章:

ANSI 格式的 JavaScript CSV 文本下载 (Windows-1252)

javascript - knockout checkValue一直设置为 "on"

javascript - 同一页面中多个组件的 Vue JS Spinner(单个应用程序)

javascript - 使用 javascript 查找 <textarea> 当前行的值

jquery-ui - 导轨 3.2 : jQuery UI icons are missing

css - 更改 jQueryUI 对话框关闭 X 的颜色

javascript - 如何进行 CKEditor 5 图片上传?

javascript - 通过单击链接而不是正在调整大小的元素来动画调整大小

javascript - 收到的数据修改后再次ajax 'POST'

javascript - 如何让物体向鼠标位置移动?