【问题标题】:jQuery $.ajaxError() runs on 200 - OKjQuery $.ajaxError() 在 200 上运行 - OK
【发布时间】:2010-12-08 00:01:08
【问题描述】:

我有一个全局 ajax 错误处理程序,即使 xhr.status 为 200、xhr.statusText 为“OK”且 xhr.responseText 是我的 JSON 字符串,它也会运行。这发生在 Firefox 和 IE 中。

$.ajax({
    data: {
        method: "getRequestDetails",
        loggedInUsername: loggedInUsername,
        search: search
    },
    success: function(data){
        var arrayObject = eval("(" + data + ")")['DATA'];
        if (arrayObject.length == 0){
            alert("That search term returned no results");
        } else {
            callBeforeShow("Results");
            $.each(arrayObject, function(index, value){
                showJSON(value, "Results");
            });
            callAfterShow("Results");
        }
    }
});

$(document).ajaxError(function(event, XMLHttpRequest, ajaxOptions, thrownError){
    var errorMessage = "Ajax Error\n";
    errorMessage += "Type: " + ajaxOptions.type + "\n";
    errorMessage += "Requesting Page: " + ajaxOptions.url + "\n";
    errorMessage += "Status: " + XMLHttpRequest.status + " - " + XMLHttpRequest.statusText + "\n";
    errorMessage += "Error Thrown: " + thrownError
    alert(errorMessage);
});

在 IE 中这表示 XMLHttpRequest 尚未准备好,而在 Firefox 中则返回

“AJAX 错误” “类型:POST” “请求页面:something.CFC” “状态:200 - 正常” “抛出的错误:未定义”

所以我的解决方法是使用

$(document).ajaxComplete(function(event, XMLHttpRequest, ajaxOptions, errorThrown){
    if (XMLHttpRequest.status != 200){
        var errorMessage = "Ajax Error\n";
        errorMessage += "Type: " + ajaxOptions.type + "\n";
        errorMessage += "Requesting Page: " + ajaxOptions.url + "\n";
        errorMessage += "Status: " + XMLHttpRequest.status + " - " + XMLHttpRequest.statusText;
        alert(errorMessage);
    }
});

编辑 *这只发生在某些情况下。大多数时候它可以工作,但有时它会运行 $.ajaxError()* EIDT

{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]}{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]}{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]}

最新版本的firebug将其识别为json。

【问题讨论】:

    标签: ajax jquery


    【解决方案1】:

    首先,我强烈建议放弃eval 部分,转而使用自动处理解析的$.parseJson 或dataType:'json' ajax 选项(出于性能和安全等原因)。如果您继续使用eval,至少将其包装为try catch。

    我不完全确定调用 ajaxError 的每种情况,但我怀疑(基于错误的“随机性”)它与成功函数内部的错误有关(例如被调用的 eval在您在回复中收到的无效 javascript 上)。这可以解释为什么即使有 200 响应也会调用它。

    tldr:从success 回调中获取eval,并在发生此错误时断言您的响应实际上是有效的json。

    【讨论】:

    • 这是在工作 Intranet 上。我们正在使用 jQuery 1.3.2,尝试获取最新版本可能会很麻烦($.parseJson() 需要它。而且我无法使用 javascript JSON.parse() 或其他任何东西,因为我们使用的是不支持 JSON 对象的 IE7。无论如何,错误是在 eval 之前运行的。
    • 当你得到错误时,你能包括你得到的json响应吗?由于您描述的随机性和错误,我怀疑它与发送回的实际响应有关。 jQuery 1.3.2 中还提供了 dataType:'json' 选项。我强烈鼓励使用它。
    • 当我指定数据类型时,什么都不起作用。编辑以包含返回的 json 字符串。
    • @jthompson 我是怎么使用它的?
    • 您是否将 eval 语句包装在 try catch 中?您在提供的 JSON 中有一个解析错误。试试json.parser.online.fr
    【解决方案2】:

    可能是因为您没有告诉$.ajax 您希望从服务器返回 JSON?尝试将dataType 选项设置为“json”:

    $.ajax({
        dataType: 'json',
        data: { ...
    

    【讨论】:

    • 我在页面上有 10 个其他的 ajax 调用,一些使用普通的,另一些使用 json 并且没有该声明它们可以正常工作。但无论如何我都会试一试。
    • 现在 firebug 正在这样做。未捕获的异常:[异常...“组件返回失败代码:0x80040111(NS_ERROR_NOT_AVAILABLE)[nsIXMLHttpRequest.status]”nsresult:“0x80040111(NS_ERROR_NOT_AVAILABLE)”位置:“JS 框架 :: myUrl.js :: 匿名 :: 第 146 行”数据:没有]。第 146 行是 $.ajaxError() 中的第 4 行
    【解决方案3】:

    当我将该 json 复制并粘贴到此格式化程序/验证器 http://jsonformatter.curiousconcept.com/ 时,出现两个错误

    在 }{ 之间缺少 2 个逗号。

    【讨论】:

      【解决方案4】:

      啊,经过几天的搜索,我在 $.ajaxSetup() 中注释掉了不同的设置。结果是我设置了超时。如果只给出更好的错误消息。感谢所有帮助的家伙,如果没有你,就不会来到这里。你们都起来投票!!!

      【讨论】:

      • 你知道为什么超时会导致这个吗?您是坚持使用原来的 ajaxComplete 处理程序还是找到了更优雅的方法?我也遇到了这个问题,不明白。
      • 不,我没有发现。我已经落后于计划修复它,所以我只是接受它有效,我可能永远不会知道为什么。对不起
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 2018-12-11
      • 1970-01-01
      相关资源
      最近更新 更多