当我使用 Appcache Manifest 请求外部资源时,为啥 jQuery 会抛出错误?

Posted

技术标签:

【中文标题】当我使用 Appcache Manifest 请求外部资源时,为啥 jQuery 会抛出错误?【英文标题】:Why does jQuery throw an error when I request external resources using an Appcache Manifest?当我使用 Appcache Manifest 请求外部资源时,为什么 jQuery 会抛出错误? 【发布时间】:2013-08-12 22:14:53 【问题描述】:

我有一个使用 .appcache 清单的应用程序。一切正常,资源被缓存:

CACHE MANIFEST

CACHE:
css/images/ajax-loader.gif
[...]

NETWORK:
http://docs.google.com/*

SETTINGS:
prefer-online

现在,当我像这样从 http://docs.google.com 请求 CSV 资源时:

$.get(url, function (data) 
  // do something with the data
).fail(function () 
  alert("There was an error in loading current data from the server.");
);

即使我真的在线(在 Chrome 和 FF 上),请求也会失败。在我使用 Appcache 之前一切正常。

在拥有 Appcache 清单时请求外部资源的正确方法是什么?

【问题讨论】:

我得出的结论是,它实际上可能与跨域资源共享有关,因为我不控制谷歌文档(它可能以前有效,因为相关文件仍在我的浏览器缓存)。 Chrome 显示“已取消”状态代码,但是,在 FF 中,我的方法效果很好。这是为什么呢? 查看此 JQuery.ajax() 文档中的“缓存”部分:api.jquery.com/jQuery.ajax。如果你使用它而不是 'get()' 和 'cache: false' 会发生什么? @Holf 感谢您的建议,显然真正的问题出在其他地方,请参阅下面的答案(花了我几个小时)。还是谢谢! 【参考方案1】:

我刚刚开始使用 tabletop。没有更多的 CORS 问题.. 暂时。

【讨论】:

【参考方案2】:

正如我在评论中提到的,问题不仅在于 jQuery,还在于 CORS。 Google Docs 不支持它(“发布到网络”意味着下载,而不是从不同的 URL 请求资源,即来源。显然 Google 不想添加 Header set Access-Control-Allow-Origin "*"

所以我所做的是遵循这个有用的指南:https://webapps.stackexchange.com/questions/11864/how-can-i-retrieve-records-from-a-google-spreadsheet-in-json-format 和 https://developers.google.com/gdata/samples/spreadsheet_sample(URL 现在不是 CSV 而是 JSONP,它也更改为 //spreadsheets.google.com/feeds/list/[...]/[...]/public/values?alt=json-in-script 并且 jQuery 会在调用时自动添加 callback=xxx

$.ajax(
  url : url,
  type : 'GET',
  dataType : 'jsonp',
  success : function (data) 
    for(var i in data.feed.entry) 
      console.log(entry['gsx$' + 'actualColumnHeader'].$t);
    
  ,
  error : function () 
    alert('Failed');
  
);

这无论如何都不好或不干净(Atom Feed 而不是 CSV 或 JSON,只是为了解析它?真的吗?),但它对我有用。

【讨论】:

以上是关于当我使用 Appcache Manifest 请求外部资源时,为啥 jQuery 会抛出错误?的主要内容,如果未能解决你的问题,请参考以下文章

IIS7 的 AppCache mime 类型

HTML5 使用application cache 接口实现离线数据缓存

HTML5-离线存储

H5 应用程序缓存(离线缓存)

HTML5 离线应用程序 接口实现离线数据缓存精心收藏

H5应用程序缓存浅谈及实际测试