【问题标题】:Cross browser AJAX and setTimeout() works in IE but fails in Chrome/Firefox跨浏览器 AJAX 和 setTimeout() 在 IE 中有效,但在 Chrome/Firefox 中失败
【发布时间】:2012-11-01 03:29:04
【问题描述】:

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

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

当我尝试按下 Firebug 中的保存按钮时,我看到的是我到达了第一个 AJAX 调用,我得到了 200OK 响应以及它花费的时间(毫秒),但是它一直在旋转:


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 正常 缓存控制:私有,max-age=0 内容类型:应用程序/json;字符集=utf-8 服务器:Microsoft-IIS/7.5 X-Powered-By: ASP.NET 日期:格林威治标准时间 2012 年 10 月 31 日星期三 15:30:01 内容长度:178

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

IE:

HTTP/1.1 200 正常 缓存控制:私有,max-age=0 内容类型:应用程序/json;字符集=utf-8 服务器:Microsoft-IIS/7.5 X-Powered-By: ASP.NET 日期:格林威治标准时间 2012 年 10 月 31 日星期三 15:29:53 内容长度:178

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

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

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

里面应该只有 2 个条目。

【问题讨论】:

  • 所以它不是那么跨浏览器,是不是......?
  • AjaxCall 函数在哪里?你在做同步 aJAX 吗?
  • @dystroy 我猜是AjaxCall(...)?
  • $.blockUI 方法是什么?扩展 Jquery ?
  • 你能告诉我们AjaxCall吗?

标签: c# javascript jquery cross-browser settimeout


【解决方案1】:

哇...为了这么愚蠢的事情付出了所有努力...

感谢这个帖子,我弄清楚了我的问题是什么:JQuery Ajax Firefox Error

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

onclick="return SubmitForm();"

来自:

onclick="SubmitForm();"

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

感谢所有研究它的人。希望这对将来的某人有所帮助,尽管我怀疑有很多人像我一样愚蠢...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多