如何使用jQuery在JSON ajax请求中回调404上的函数?

我想用JSON中的响应发出Ajax请求。 所以我提出了这个Ajax请求:

$.ajax({ url: 'http://my_url', dataType: "json", success: function(data){ alert('success'); }, error: function(data){ alert('error'); }, complete: function(data) { alert('complete') }}) 

这段代码工作正常但是当我的url发送给我一个HTTP代码404时,没有使用回调,甚至是完整的回调。 经过研究,这是因为我的dataType是’json’所以404返回是HTML并且JSON解析失败了。 所以没有回调。

有一个解决方案在404被引发时调用回调函数吗?

编辑:完成回调不调用返回是404.如果你想要一个URL机智404你可以打电话: http : //twitter.com/status/user_timeline/jksqdlmjmsd.json?count = 3& callback = jsonp1269278524295&_ = 1269278536697这是这个url我有我的问题。

 $.ajax({ url: 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697', dataType: "json", success: function(data) { alert('success'); }, error: function(data) { alert('error'); }, complete: function(xhr, data) { if (xhr.status != 0) alert('success'); else alert('fail'); } }) 

使用您的配置,jQuery使用jsonp来传输数据。 这可以通过动态插入脚本元素并将URL设置为指定值来实现。 然后,服务器返回的数据被评估为JavaScript – 通常调用提供的回调。 如果服务器返回404,则内容显然不是JavaScript,并且永远不会调用回调。 某些浏览器支持脚本标记上的error handling程序,在这些情况下会调用它们。 不幸的是,IE不支持这一点。 检测错误的最佳方法是依赖超时。

在您的情况下,您应该指定一个额外的timeout选项,如果未及时调用回调,则会调用error handling程序(404响应就是这种情况)。

 $.ajax({ url: 'http://my_url', timeout: 2000, // 2 seconds timeout dataType: "json", success: function(data){ alert('success'); }, error: function(data){ alert('error'); }, complete: function(data) { alert('complete') } }); 

如果您想在使用Javascript和jsonp访问Twitter API时处理错误,则需要在请求中包含参数suppress_response_codes 。 这使得来自Twitter API的所有响应都响应200 OK响应并包含错误。 然后,您需要检查响应是否包含error参数。

 $.ajax({ url: "https://api.twitter.com/1/users/show.json", dataType: 'jsonp', jsonp: "callback", data: { screen_name: "simongate1337", suppress_response_codes: true // <- Important part }, success: function(data) { if(data.error) { console.log("ERROR: "+data.error); } else { console.log("Success, got user " + data.screen_name); } } }); 

使用statusCode -Option

 $.ajax({ url: 'http://my_url', dataType: "json", statusCode: { 404: function() { alert("I could not find the information you requested."); } }, success: function(data) { alert('success'); }, error: function(data) { alert('error'); }, complete: function(data) { alert('complete'); } }) 

您是否认为问题不在于dataType,而在于您不允许进行跨域请求?

当您从同一域请求数据时,下面的代码按预期工作,而当您发出跨域请求时,代码不符合要求:

 function handle404(xhr){ alert('404 not found'); } function handleError(xhr, status, exc) { // 0 for cross-domain requests in FF and security exception in IE alert(xhr.status); switch (xhr.status) { case 404: handle404(xhr); break; } } function dumbRequest() { var url = 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697'; url = 'http://twitter.com/'; url = '/mydata.json'; // url = 'mydata.json'; $.ajax( {url: url, dataType: 'json', error: handleError} ); } 

是因为dataType设置为“json”吗? 如果是这样,请尝试将其更改为text并自行评估JSON:

 $.ajax({ url: 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697', dataType: 'text', success: function(data, status, xmlHttp) { try { data = eval('(' + data + ')'); alert('success'); } catch (e) { alert('json parse error'); } }, error: function(xmlHttp, status, error) { alert('error'); }, complete: function(xmlHttp, status) { alert('complete'); } }); 

您是否知道即使HTTP状态为404,实际正文也是有效的JSON? 例如, 此链接具有以下JSON:

jsonp1269278524295({"request":"/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697","error":"Not found"})

因此,您应检查您的数据是否在正常回调函数中具有error属性。

更新 :显然,即使页面的实际内容是有效的JSON,浏览器(我在Firefox中检查)也没有执行它,很可能是因为它是404.因为jQuery必须添加一个script元素(因为交叉-domain问题),它的JSONP包装器永远不会被调用,因此,你的回调也不会。

所以,简而言之,我认为没有办法处理这个问题,而无需手动添加该脚本元素并检查之后是否调用了预定义的回调函数。

刚刚面临同样的问题,并看到另一个问题,提到jQuery-JSONP(jQuery插件)支持捕获404错误或者他们描述:“ 网络故障或格式错误的JSON响应时的错误恢复”

它完美:)

以下是我通过JSONP获取YouTubevideo详细信息的(简化)代码:

 $.jsonp( { url: "https://gdata.youtube.com/feeds/api/videos/ee925OTFBCA", callbackParameter: "callback", data: { alt: "jsonc-in-script", v: "2" }, success: function(json, textStatus) { console.log("WEEEEEEEE!"); }, error: function(xOptions, textStatus) { console.error(arguments); } }); 

这是我如何处理这个问题。 在尝试使用它之前,我检查返回的数据是否有错误。 下面显示的只是一个示例,您可以扩展到更符合您的要求。 这也考虑了会话超时和其他场景……

我最初的电话:

  $.ajax({ type: 'POST', url: '../doSomething', data: 'my data', success: function(data) { if (HasErrors(data)) return; var info = eval('(' + data + ')'); // do what you want with the info object }, error: function(xmlHttpRequest) { ReportFailure(xmlHttpRequest); } }); 

以及两个辅助函数:

 function HasErrors(data) { if (data.search(/login\.aspx/i) != -1) { // timed out and being redirected to login page! top.location.href = '../login.aspx'; return true; } if (data.search(/Internal Server Error/) != -1) { ShowStatusFailed('Server Error.'); return true; } if (data.search(/Error.aspx/) != -1) { // being redirected to site error reporting page... ShowStatusFailed('Server Error. Please try again.'); return true; } return false; } 

 function ReportFailure(msg) { var text; if (typeof msg == 'string') { text = msg; } else if (typeof msg.statusText == 'string') { if (msg.status == 200) { text = msg.responseText; } else { text = '(' + msg.status + ') ' + msg.statusText + ': '; // use the Title from the error response if possible var matches = msg.responseText.match(/\(.*?)\<\/title\>/i); if (matches != null) { text = text + matches[1]; } else { text = text + msg.responseText; } } } // do something in your page to show the "text" error message $('#statusDisplay') .html('' + text) .addClass('StatusError'); } 

以下解决方案对我来说工作正常:)

 $.ajax({ url: 'http://my_url', dataType: "json", success: function(data){ alert('success'); }, error: function(data){ alert('error'); },complete: function(xhr, data) { if(data==="parsererror"){ alert('404'); } } });