Обнаружение жизнеспособности applicationCache удаленного ресурса

Я пытаюсь определить, доступен ли кеш (полученный с помощью applicationCache и манифеста кеша HTML5), расположенный в другом домене (локальная файловая система или WWW).

Ресурс проверки кеша (механизм шлюза, если хотите) находится в локальной файловой системе и загружается через веб-просмотр. Это требование, которое я не могу обойти.

До недавнего времени этот локальный файл шлюза проверял, находится ли устройство в сети, и перенаправлял на удаленный ресурс с помощью window.location, а если устройство не было в сети, он отображал графику (также локально упакованную), которая, по сути, говорила: «Вы должны подключитесь к Интернету, чтобы использовать эту функцию».

Однако я совсем недавно реализовал автономную поддержку на этом удаленном ресурсе. Оно работает. Если у нас есть файл шлюза, который просто перенаправляет на удаленный ресурс в автономном режиме, он загружает удаленный ресурс из кеша.

Существует вероятность того, что пользователь может попытаться использовать устройство в автономном режиме, когда он еще не получил к нему доступ через Интернет, поэтому в код шлюза необходимо поместить логику, чтобы проверить, существует ли кеш или нет. Я столкнулся с междоменными проблемами, которых я ожидал, но я не уверен, как это исправить.

Вот код, который я пробовал:

if (window.navigator.onLine === false) {
    // See if we're able to reach the content (if it's cached, we'll get HTML, else it'll fail)
    cacheCheck = $.ajax(contentLoc, {async:false});

    // the request failed so we have no cache at all. let's just show the offline graphic.
    if (cacheCheck.status === 0) { // no cache available :(
        $("#launchpage").addClass("offline");
    } else { // we have a cache :)
        redirect();
    }
} else {
    redirect();
}

Когда я писал его, я наивно надеялся, что $.ajax() извлечет кешированную версию (если она существует), и я мог просто проверить возвращенный объект, чтобы убедиться, что возвращенный код состояния не является статусом ошибки. код.

Однако это не работает, так как объект возвращает «Ошибка: NETWORK_ERR: Исключение XMLHttpRequest 101»

Есть ли какой-либо другой метод, который я могу использовать, чтобы определить, безопасно ли перенаправлять? Требуется, чтобы я отображал локальное изображение, если перенаправление не удалось (из-за отсутствия кеша)


person WhiskeyTangoFoxtrot    schedule 04.02.2015    source источник


Ответы (1)


Я придумал обходной путь. Если я ввожу iframe, указывающий на удаленный ресурс, и проверяю, загружает ли этот iframe HTML (я специально проверяю, содержит ли тег атрибут manifest), он предполагает, что кеш существует, и он может выполнить перенаправление.

Если я не получаю ожидаемого результата, отображается изображение ошибки. Хотя в моей реализации графика всегда отображается в автономном режиме, так как мне приходится ждать асинхронной загрузки iframe.

Вот пример кода, чтобы заставить его работать:

if (window.navigator.onLine === false) {
// We're offline, so show the offline graphic, in case the future test fails (i.e., no cache available)
    $("#launchpage").addClass("offline");

    // Create an iframe pointing to the canvas. If it loads, we have a cache
    $('body').append('<iframe id="offlineTest" src="'+contentLoc+'" style="display:none;" />');

    $('#offlineTest').bind('load', function() {
        // See if the result HTML tag has a manifest tag.
        manifest = $("#offlineTest").contents().find('html').attr('manifest');

        if (manifest !== undefined) { // cache is available.
            redirect();
        }
    });
} else {
    redirect();
}
person WhiskeyTangoFoxtrot    schedule 11.02.2015