跨浏览器AJAX和setTimeout()在IE中运行但在Chrome / Firefox中失败

时间:2012-10-29 18:16:38

标签: c# javascript jquery cross-browser settimeout

确定。这几天让我感到沮丧。我确定我是个白痴,面前有一个解决方案,但这是我的问题。

我有一系列AJAX调用,当按下Save按钮时,它会处理并保存网页中的数据。这已经在IE中工作了多年(在我被聘用之前设置)并且没有任何问题。我们现在需要支持多种浏览器,即IE,Firefox,Chrome和Safari。

当我尝试按下Firebug中的保存按钮时,我看到的是我接到第一个AJAX调用,我得到了200OK响应和ms所花费的时间,但是它一直在旋转:

Continues to spin forever
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”而错误输出为errorThrown。

编辑3: 来自Fiddler的原始数据

的FireFox:

HTTP / 1.1 200好的 Cache-Control:private,max-age = 0 Content-Type:application / json;字符集= utf-8的 服务器:Microsoft-IIS / 7.5 X-Powered-By:ASP.NET 日期:2012年10月31日星期三格林尼治标准时间15:30:01 内容长度:178

{ “d”:{ “__类型”: “CoreMotives.Web.MethodResult”, “成功”:真, “注释”: “”, “消息”: “”, “ElapsedMilliseconds”:0 “子测试” :NULL, “NextStepAdditionalParameters”:空, “值”:空}}

IE:

HTTP / 1.1 200好的 Cache-Control:private,max-age = 0 Content-Type:application / json;字符集= utf-8的 服务器:Microsoft-IIS / 7.5 X-Powered-By:ASP.NET 日期:2012年10月31日星期三格林尼治标准时间15:29:53 内容长度:178

{ “d”:{ “__类型”: “CoreMotives.Web.MethodResult”, “成功”:真, “注释”: “”, “消息”: “”, “ElapsedMilliseconds”:0 “子测试” :NULL, “NextStepAdditionalParameters”:空, “值”:空}}

再说一次。在服务器端代码返回任何内容之前,AJAX调用命中错误处理程序。

编辑4: 链接到Fiddler的.saz文件。 http://tinyurl.com/ckmatsk

那里应该只有2个条目。

1 个答案:

答案 0 :(得分:0)

哇......所有这些努力都是为了这么愚蠢......

由于这个帖子我想出了我的问题:JQuery Ajax Firefox Error

SubmitForm()方法未返回false,因此浏览器默认行为正在接管。一旦我将onclick更改为:

onclick =“return SubmitForm();”

从:

的onclick = “SubmitForm();”

并使SubmitForm()返回false。它开始在Chrome和Firefox中运行。

感谢所有正在调查的人。希望这可以帮助将来的某个人,虽然我怀疑有许多人像我一样愚蠢......