0

Ok。これは数日間私を苛立たせています。私はばかだと確信しており、目の前に解決策がありますが、ここに私の質問があります。

[保存] ボタンが押されたときに Web ページのデータを処理して保存する一連の AJAX 呼び出しがあります。これはIEで何年も機能しており(私が雇われる前にセットアップされていました)、問題はありませんでした。複数のブラウザー、つまり IE、Firefox、Chrome、および Safari をサポートする必要があります。

Firebug で保存ボタンを押そうとすると、最初の AJAX 呼び出しに到達し、200OK 応答が返され、ms でかかった時間が表示されますが、回転し続けます。

永遠に回り続ける
17 秒は、サーバー側のコードをステップ実行したためです。

AJAX 成功ハンドラー メソッドが呼び出されることはなく、すべてがバラバラになります。検索で見つけたいくつかの異なる方法を試しましたが、どれも大きな違いはないようです。これが元のコードです。

編集 5: 更新されたコードは次のとおりです。単純化して、Step() メソッドとすべてのタイムアウトを取り除きました。問題を引き起こしているのは AJAX 呼び出しだけです。

    function SubmitForm() {
        $.blockUI({ message: waitMessage, css: { padding: 5} });

        var settingsXml = GetSettingsXml();
        ajaxParameters = "customerId:'" + customerId + "', connectionId:" + connectionId + ", settingsXml:'" + settingsXml + "', securityToken:'" + securityToken + "'";

        AjaxCall("EmailMarketingSettings.aspx", "Validate", ajaxParameters, function (result) {
            alert("It works!")
        }, function (result) {
            alert("It's broken!");
        });
    }

Validate()return ステートメントに到達しますが、コードがクライアント側の成功メソッドに戻ることはありません。

私は何が欠けていますか?

編集: 要求された AjaxCall メソッドは次のとおりです。

function AjaxCall(pageName, methodName, parameters, onSuccessCallback, onFailureCallback) {
    $.ajax({
        type: "POST",
        url: pageName + "/" + methodName,
        data: "{" + parameters + "}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        timeout: 120000,
        success: function (resp) {
            result = resp.d;
            if (result.Success) {
                if (onSuccessCallback != null && typeof (onSuccessCallback) == "function") {
                    onSuccessCallback(result);
                } else {
                    $.unblockUI();
                }
            } else if (onFailureCallback != null && typeof (onFailureCallback) == "function") {
                onFailureCallback(result.Message);
            } else {
                alert(result.Message);
                $.unblockUI();
            }
        },
        error: function (req, errorType, errorThrown) {
            var errorMessage = "";
            if (errorType == "timeout") {
                errorMessage = "A timeout has occured"
            } else if (req.responseText.length > 0) {
                errorMessage = (req.responseText.substring(0, 1) == "{" ? eval("(" + req.responseText + ")").Message : req.responseText);
            } else {
                errorMessage = req.status;
            }
            if (onFailureCallback != null && typeof (onFailureCallback) == "function") {
                onFailureCallback(errorMessage);
            } else {
                alert("An error has occured: " + errorMessage);
                $.unblockUI();
            }
        }
    });
}

編集 2: リクエストが送信されるとすぐに、サーバー側のコードが何かを返す前にエラー ハンドラーをヒットします。AJAX 呼び出しは、何も返されるのを待っていません。「error」の errorType と errorThrown の空の文字列でエラーが発生しているだけです。

編集 3: Fiddler からの生データ

ファイアフォックス:

HTTP/1.1 200 OK Cache-Control: private, max-age=0 Content-Type: application/json; charset=utf-8 サーバー: Microsoft-IIS/7.5 X-Powered-By: ASP.NET 日付: 2012 年 10 月 31 日水曜日 15:30:01 GMT コンテンツの長さ: 178

{"d":{"__type":"CoreMotives.Web.MethodResult","Success":true,"Comments":"","Message":"","ElapsedMilliseconds":0,"SubTests":null, "NextStepAdditionalParameters":null,"値":null}}

いいえ:

HTTP/1.1 200 OK Cache-Control: private, max-age=0 Content-Type: application/json; charset=utf-8 サーバー: Microsoft-IIS/7.5 X-Powered-By: ASP.NET 日付: 2012 年 10 月 31 日水曜日 15:29:53 GMT コンテンツの長さ: 178

{"d":{"__type":"CoreMotives.Web.MethodResult","Success":true,"Comments":"","Message":"","ElapsedMilliseconds":0,"SubTests":null, "NextStepAdditionalParameters":null,"値":null}}

繰り返しますが。AJAX 呼び出しは、サーバー側のコードが何かを返す前にエラー ハンドラーにヒットします。

編集 4: Fiddler から .saz ファイルにリンクします。 http://tinyurl.com/ckmatsk

そこには 2 つのエントリしかないはずです。

4

1 に答える 1

0

うわー...とてもばかげたことのためにこのすべての努力...

このスレッドのおかげで、私の問題が何であるかを理解しました: JQuery Ajax Firefox Error

SubmitForm() メソッドが false を返さなかったため、ブラウザのデフォルトの動作が引き継がれていました。onclickを次のように変更するとすぐに:

onclick="return SubmitForm();"

から:

onclick="SubmitForm();"

そして、SubmitForm() が false を返すようにしました。Chrome と Firefox の両方で動作するようになりました。

調べてくれた人ありがとう。願わくば、これが将来誰かに役立つことを願っていますが、私と同じくらい愚かな人はいないと思います...

于 2012-10-31T19:29:04.783 に答える