我正在制作一个webapp。它加载的某些文件包含纯静态.JSON数据。我正在将jQuery.ajax()(jQuery 1.5.2)与dataType:'json'和cache:true一起使用。一切正常,所有文件都已加载。我还配置了缓存 list 以缓存这些JSON文件(除了css,js和images)。一切也都可以正常工作-当用户访问我的网站时,我需要的所有文件都正确地缓存了(我有applicationCache事件处理程序来确认一切正常)。我已经在Google Chrome浏览器中测试了所有内容,并且可以看到所有文件(包括JSON文件)都已缓存。当我断开网络连接时,一切正常(jQuery ajax调用自动获取缓存的JSON文件)。

现在,我正在尝试在移动Safari(在实际的iPad和iPhone模拟器上)上对此进行测试。在Safari中,一切都按预期方式进行-缓存了页面,并且在断开网络连接的后续访问中,使用了缓存的文件。

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

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

最佳答案

好吧,我讨厌不得不回答自己的问题,但是如果有人遇到这个问题,我会做以下事情:

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

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

09-20 16:35