您好,我注意到,这个简单的代码无法正常工作……
function test() { $.ajax( { 'url' : 'test/GameConfiguration.json', 'dataType' : 'json', data : { a : 'aaa' }, cache : false, method : 'get', timeout : 10000, //10 secs of timeout success : function(data, textStatus, XMLHttpRequest) { console.log("success"); if (data == null) console.log("it's not a real success"); }, error : function(XMLHttpRequest, textStatus, errorThrown) { console.log("error: " + textStatus); } }); }
该测试已在localhost上运行,我的意思是:我加载页面,关闭本地Web服务器,然后触发请求(通过一个简单的按钮,其中onclick指向此功能)。错误永远不会被调用,我得到的是调用成功处理程序,它具有textStatus =“ success”和data = null。我什至注意到请求在10秒之前就超时了。在Firefox(最新版本),Chrome(最新版本)和Safari 5上会发生这种情况。为什么呢?是由于我在本地主机上工作吗?
我忘了告诉:请求没有被缓存。实际上,firebug和Chrome开发人员工具都显示请求失败。
大更新
此行为与本地主机的使用有关。实际上,如果我从另一台同事PC加载此页面,并且在触发请求之前我已断开PC与网络的连接,则可以正确获取以超时为状态触发的错误处理程序。我认为这是jQuery的错误。这将使我很难测试超时错误:(
jQuery论坛的家伙说这是由于网络堆栈中止连接的方式(假设主机是localhost)。我仅在Windows 7上测试过。如果您想在其他系统上进行测试,并且可以解决一些jQuery内部问题,请在jQuery论坛上向此职位举报:
http://forum.jquery.com/topic/strange-and-unexpected-behaviour-of-ajax-error- and-localhost#14737000001331961
更新 :尝试将测试替换(data == null)为(XMLHttpRequest.readyState === 4 && XMLHttpRequest.status === 0)。
(data == null)
(XMLHttpRequest.readyState === 4 && XMLHttpRequest.status === 0)
在有关XMLHttpRequest标准的W3C候选推荐中,描述了它必须存在,因此命名为“错误标志”,该标志应用于指示某种类型的网络错误或中止。如果发生此类错误,状态XMLHttpRequest为0,而不是200(“确定”),201(“已创建”),304(“未修改”)等等。要完全对应于http://www.w3.org/TR/XMLHttpRequest/#the- status-attributeXMLHttpRequest.status,如果XMLHttpRequest.readyState等于0或1(“未发送”或“已打开”),则可以为0 。另一种情况XMLHttpRequest.readyState等于4(“完成”),并且“错误标志”为true。如果我们没有这两种情况,则XMLHttpRequest.status必须为HTTP状态代码。在http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html下或http://www.w3.org/Protocols/HTTP/1.0/spec.html#Status- Codes没有等于0的HTTP状态代码。所以在我看来,您可以执行以下操作
XMLHttpRequest
XMLHttpRequest.status
XMLHttpRequest.readyState
jQuery(document).ready(function () { $.ajax({ type: 'GET', url: 'test/GameConfiguration.json', dataType: 'json', cache : false, success: function(data, textStatus, xhr){ if (xhr.readyState === 4 && xhr.status === 0) { // if readyState is DONE (numeric value 4) then corresponds to // http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-done // "The DONE state has an associated error flag that indicates // some type of network error or abortion." // Corresponds to http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute // If error flag it true, xhr.status is 0. alert('"error flag\" is true. It means that we have a network error"+ " or abortion (for example because of Same Origin Policy restrictions)'); } else { alert(textStatus); alert(data); } }, error: function(xhr, textStatus, errorThrown) { if (textStatus !== null) { alert("error: " + textStatus); } else if (errorThrown !== null) { alert("exception: " + errorThrown.message); } else { alert ("error"); } } }); });