Почему jQuery выдает ошибку, когда я запрашиваю внешние ресурсы с помощью манифеста Appcache?

У меня есть приложение, которое использует манифест .appcache. Все работает как положено, ресурсы кешируются:

CACHE MANIFEST

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

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

SETTINGS:
prefer-online

Теперь, когда я запрашиваю ресурс CSV с http://docs.google.com, например:

$.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?


person nekaab    schedule 11.08.2013    source источник
comment
Я пришел к выводу, что на самом деле это может быть связано с общим доступом к ресурсам между источниками, поскольку я не контролирую документы Google (возможно, это работало раньше, потому что соответствующий файл все еще находился в кеше моего браузера). Chrome показывает код состояния, отмененный, однако в FF мой подход прекрасно работает. Почему это?   -  person nekaab    schedule 11.08.2013
comment
Посмотрите раздел «кэш» в этой документации JQuery.ajax(): api.jquery.com/jQuery .ajax. Что произойдет, если вы используете это вместо «get ()» с «cache: false»?   -  person Holf    schedule 11.08.2013
comment
@Holf Спасибо за предложение, видимо, настоящая проблема была где-то в другом месте, см. Мой ответ ниже (стоил мне несколько часов). Спасибо, в любом случае!   -  person nekaab    schedule 11.08.2013


Ответы (2)


Как я уже упоминал в своем комментарии, проблема заключалась не только в jQuery, но и в CORS, соответственно. Документы Google не поддерживают его («Опубликовать в Интернете» означает загрузку, а не запрос ресурса с другого URL-адреса, то есть источника. Очевидно, Google не хочет добавлять Header set Access-Control-Allow-Origin "*".

Поэтому вместо этого я следовал этому полезному руководству: json-format">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 только для того, чтобы проанализировать его обратно? Серьезно?), но это работает для меня.

person nekaab    schedule 11.08.2013

Я только что научился работать с tabletop. Больше никаких проблем с CORS... пока.

person David Jacquel    schedule 11.12.2014