jQuery $ .ajaxError()在200上运行 - 好的

Tim*_*hle 9 ajax jquery

我有一个全局的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);
});
Run Code Online (Sandbox Code Playgroud)

在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);
    }
});
Run Code Online (Sandbox Code Playgroud)

编辑 *这只发生在一些场合.它大部分时间都可以工作,但有时会运行$ .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":[]}]]}
Run Code Online (Sandbox Code Playgroud)

最新版本的firebug认为它是json.

nat*_*ood 5

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

我不完全确定调用ajaxError的所有情况,但我怀疑(基于错误的"随机性")它与成功函数内部的错误有关(就像eval被调用无效的javascript那样'重新参与你的回复).这可以解释为什么即使有200响应它也会被调用.

tldr:当发生此错误时,eval退出该success回调并声明您的响应实际上是有效的json.

  • 您可以使用Douglas Crockfords JSON库:http://www.json.org/js.html. (6认同)

Tim*_*hle 1

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