使用jQuery.ajax()无法使用AJAX从iOS设备中保存到主屏幕的AJAX访问清单缓存文件

我正在制作一个webapp。 它加载的一些文件包含纯静态.JSON数据。 我正在使用带有dataType的jQuery.ajax()(jQuery 1.5.2):’json’和cache:true。 一切正常,所有文件都已加载。 我还配置了缓存清单来缓存这些JSON文件(除了css,js和images)。 一切都运行良好 – 当用户访问我的网站时,我需要的所有文件都正确缓存(我有applicationCache事件处理程序,确认一切都很好)。 我已经测试了谷歌浏览器中的所有内容,我可以看到所有文件(包括JSON文件)都已缓存。 当我断开网络连接时,一切正常(jQuery ajax调用自动获取缓存的JSON文件)。

现在我试图在移动Safari上测试这个(在实际的iPad和iPhone模拟器上)。 在Safari中,一切都按预期工作 – 页面被缓存,并且在网络断开的后续访问中,使用缓存的文件。

但是,当我使用Safari中的“添加到主屏幕”将应用程序添加到主屏幕时,应用程序启动并且所有.js,.css和图像都正常工作,但我的Ajax调用没有! 他们不访问缓存的.json文件。 对于每个Ajax调用, XMLHttpRequest.status0.statusTexterror ,但getAllResponseHeaders()显示与Safari中的function应用程序相同(正确)的标头。

我不懂。 这是jQuery的.ajax()中的限制/错误还是什么? 任何帮助表示赞赏。

好吧,我不想回答我自己的问题,但这是我所做的,以防其他人遇到这个问题:

显然,当尝试在脱机模式下使用$ .ajax()时,请求成功获取缓存文件,但它在XHMLHttpRequest.status上返回0。 阅读完之后,我看到当用户离线时甚至在请求本地文件时,都可以返回状态码0。 但是,成功的GET应该报告200到300之间的状态代码。也许$ .ajax()检查200-300状态,否则该请求被认为是失败的。

为了解决这个问题,我在我的error handling程序中为$.ajax()请求添加了代码,该请求检查jqXHR.responseText.**length** 。 我知道我的JSON文件中的字符数正确,所以如果jqXHR.responseText.length与此已知值相同,我认为请求成功并继续加载文件。 我唯一需要做的就是在error handling程序中添加JSON.parse(jqXHR.responseText) ,因为数据不会在状态码0上解析。

另一种方法(特别是如果你是一个jQuery粉丝)可能是使用jQ Ajax方法并强制没有缓存:

 cache:false, 

显然,ajax在离线时无法加载服务器端数据,所以为什么不检查用户是否在线,如果是,请继续获取数据:

  if(navigator.onLine) { //if user's online var data = 'data=' + randomVar; $.ajax({ url: "url.php", type: "POST", timeout:45000, //45 secs data: data, cache: false, error: function () { alert("error: 45 secs have passed since request was sent. No data was returned - too slow internet connection or some other random error."); }, success: function (responseText) { // do whatever if successful } }); } // if online