1

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

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

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

我的代码似乎没有覆盖默认行为(当您单击某一天时,所有天都获得标准颜色,并且您单击的那一天被突出显示),而是似乎在它之后执行(因此在 datepicker 上重绘状态和颜色我的愿望)。

我发现令我惊讶的是,如果我使用 $.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); });
    }
});

在此示例中,单击任何一天后,日历会短暂闪烁到标准颜色模式,并完成显示 my 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); });
    }
});

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

所以我的问题是......任何人都知道为什么使用 $.ajax 或 $.post 会影响代码执行时尊重“默认日期选择器行为”的那一刻?

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

谢谢你们。

4

1 回答 1

4

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

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

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

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

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

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

希望这可以帮助。

于 2013-04-08T08:08:56.770 回答