1

わかりました、これはやや奇妙で、私はかなり驚いています。これが意図した動作なのかバグなのか、誰かが知っているのだろうか。

ASP.NET MVC アプリでは、クライアント イベントに jQuery を使用しています。datepicker オブジェクトの onSelect 属性を操作して、クリック イベントの標準的な日の色パターンをオーバーライドしようとする datepicker がいくつかあります。

基本的に、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); });
    }
});

この例では、任意の日をクリックすると、カレンダーが一瞬標準のカラー パターンにちらつき、最後に 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」オプションが設定されているためです。

デフォルトでは、「async」オプションは true に設定されています。これは、XHR の作成中にコードの実行がブロックされないことを意味します。スクリプトが追加のデータを求めてサーバーを呼び出す間、UI スレッドがブロックされないようにするため、通常はこれが望ましい動作です。

「async」オプションを false に設定すると動作が変わり、サーバーからの応答があるまでスクリプトが一時停止します。

あなたのスクリプトの最終目標が何であるかわからないので、何をすべきかについて推奨することはできません. $.postただし、このメソッドは、次のオプションを持つメソッドの省略形にすぎないことを知っておく必要が$.ajaxあります。

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

したがって、同期のブロック動作が絶対に必要な場合 (推奨されません)、$.ajax に渡されたオプションと同じオプションを使用して、「POST」タイプの AJAX 要求を取得できます。

お役に立てれば。

于 2013-04-08T08:08:56.770 に答える