Невозможно получить доступ к файлам с кэшированием манифеста с помощью AJAX из веб-приложения, сохраненного на главном экране на устройствах iOS, с помощью jQuery.ajax () - PullRequest
11 голосов
/ 29 апреля 2011

Я делаю веб-приложение. Некоторые из загружаемых файлов содержат чистые статические данные .JSON. Я использую jQuery.ajax () (jQuery 1.5.2) с dataType: 'json' и cache: true. Все работает хорошо, и все файлы загружены. Я также настроил манифест кэша для кэширования этих файлов JSON (в дополнение к css, js и images). Там тоже все работает хорошо - когда пользователь заходит на мой сайт, все нужные мне файлы кэшируются правильно (у меня есть обработчики событий applicationCache, которые подтверждают, что все хорошо). Я проверил все в Google Chrome, и я вижу, что все файлы (включая JSON) кэшируются. Когда я отключаюсь от сети, все работает (вызовы jQuery ajax автоматически выбирают кэшированные файлы JSON).

Сейчас я пытаюсь проверить это на мобильном Safari (на реальном iPad и симуляторе iPhone). В Safari все работает, как и ожидалось: страницы кэшируются, а при последующих посещениях с отключенной сетью используются кэшированные файлы.

Однако, когда я добавляю приложение на главный экран с помощью «добавить на главный экран» в Safari, приложение запускается, и все .js, .css и изображения работают правильно, НО мои вызовы Ajax не работают! Они не имеют доступа к кэшированным файлам .json. Для каждого вызова Ajax XMLHttpRequest.status - это 0, .statusText - это error, но getAllResponseHeaders() показывает те же (правильные) заголовки, что и в функциональном приложении в Safari.

Я не понимаю этого. Это ограничение / ошибка в .ajax () jQuery или что? Любая помощь приветствуется.

Ответы [ 2 ]

17 голосов
/ 30 апреля 2011

Что ж, я не хочу отвечать на свой вопрос, но вот что я сделал на случай, если кто-то столкнется с этой проблемой:

Очевидно, при попытке использовать $ .ajax () вВ автономном режиме запрос успешно извлекает кэшированные файлы, но возвращает 0 в XHMLHttpRequest.status.Прочитав это, я увидел, что код состояния 0 может быть возвращен, когда пользователь находится в автономном режиме и даже при запросе локальных файлов.Однако успешный GET должен сообщать код состояния от 200 до 300. Возможно, $ .ajax () проверяет статус 200-300, в противном случае запрос считается неудачным.

Чтобы обойти это, я добавил код в свой обработчик ошибок для запроса $.ajax(), который проверяет jqXHR.responseText.**length**.Я знаю правильное количество символов в моих файлах JSON, поэтому, если jqXHR.responseText.length совпадает с этим известным значением, я считаю запрос успешным и продолжаю загрузку файлов.Единственное, что мне нужно сделать, это добавить JSON.parse(jqXHR.responseText) в обработчик ошибок, потому что данные не анализируются в коде состояния 0.

0 голосов
/ 27 июня 2012

Другим способом (особенно если вы являетесь поклонником 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
...