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

Javascript 无法使用jQuery.AJAX()从保存到iOS设备主屏幕的webapp使用AJAX访问清单缓存文件,javascript,caching,jquery,manifest,Javascript,Caching,Jquery,Manifest,我正在制作一个网络应用程序。它加载的一些文件包含纯静态的.JSON数据。我正在使用jQuery.ajax()(jQuery 1.5.2),数据类型为“json”,缓存为:true。一切正常,所有文件都已加载。我还配置了缓存清单来缓存这些JSON文件(除了css、js和图像)。那里的一切都很好——当用户访问我的站点时,我需要的所有文件都被正确缓存(我有applicationCache事件处理程序,可以确认一切正常)。我已经在Google Chrome中测试了所有内容,我可以看到所有文件(包括JSO

我正在制作一个网络应用程序。它加载的一些文件包含纯静态的.JSON数据。我正在使用jQuery.ajax()(jQuery 1.5.2),数据类型为“json”,缓存为:true。一切正常,所有文件都已加载。我还配置了缓存清单来缓存这些JSON文件(除了css、js和图像)。那里的一切都很好——当用户访问我的站点时,我需要的所有文件都被正确缓存(我有applicationCache事件处理程序,可以确认一切正常)。我已经在Google Chrome中测试了所有内容,我可以看到所有文件(包括JSON文件)都被缓存了。当我断开与网络的连接时,一切正常(jqueryajax调用自动获取缓存的JSON文件)

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

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


我不明白。这是jQuery的.ajax()中的一个限制/错误还是什么?非常感谢您的帮助。

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

显然,当尝试在脱机模式下使用$.ajax()时,请求成功获取缓存文件,但在XHMLHttpRequest.status上返回0。读过这篇文章后,我发现当用户脱机时,甚至在请求本地文件时,都可以返回状态代码0。但是,成功的GET应报告介于200和300之间的状态代码。也许$.ajax()会检查200-300状态,否则会认为请求失败


为了解决这个问题,我为检查
jqXHR.responseText.*length**
$.ajax()
请求向错误处理程序添加了代码。我知道JSON文件中正确的字符数,所以如果<代码> JQXHR.ReaveStudio.Stime与这个已知值相同,我认为请求成功并继续加载文件。我要做的唯一额外的事情是在错误处理程序中添加
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

我也有同样的问题。诊断得很好,谢谢。@jammus,jquery1.6几天前发布了,也许这个问题已经解决了。我还没有测试过。你在用哪个jQuery?非常感谢你的帖子。我也有同样的问题。@符号:jquery-1.6.1.min.js没有解决它。@Johan,谢谢你的确认。显然,唯一的解决方法是检查$.Ajax错误处理程序中的响应。您可以测试status==0或testresponseText,看看它是否包含您期望的内容。谢谢。我一直在挠头!这里的要点是使用applicationCache访问清单缓存文件。使用
cache:false
将在url上添加缓存破坏时间戳。我认为这可能会破坏applicationCache,因为URL将不同于缓存清单中指定的URL。此外,navigator.onLine上的
true
值不一定意味着存在连接(例如,它可能意味着您连接到LAN,而不一定连接到Internet)。因此,这是不可靠的。查看其他关于检测连通性(无关联)的想法。这当然是绝对正确的,但它对我有效,所以我相信它也适用于其他人。navigator.onLine只是一种简单的方式来说明我的观点,显然还有其他更好的方式。再说一遍,只是一些例子。