Как отключить кэширование в jQuery Mobile UI - PullRequest
27 голосов
/ 11 января 2011

Пробовал ...

<div data-role="page" data-cache="30"> 
<div data-role="page" data-cache="never">
<div data-role="page" data-cache="false"> 
<div data-role="page" cache="false">

Ничто не похоже на работу ... поэтому в данный момент я исправляю проблему на стороне сервера через ...

.'?x='.rand()
.'&x='.rand()

Я не хочу отключать AJAX только кеширование.Хотя должен быть лучший способ ... я что-то упустил?

Спасибо,

Сергей

Ответы [ 6 ]

36 голосов
/ 30 июня 2011

Спасибо за ответы, ребята, и, хотя они не совсем помогли мне, они указали мне направление поиска кода, который я искал.

Это код, который я нашел в Github Gist этого джентльмена.

https://gist.github.com/921920

jQuery('div').live('pagehide', function(event, ui){
  var page = jQuery(event.target);

  if(page.attr('data-cache') == 'never'){
    page.remove();
  };
});

В этом Gist также есть код кнопки "Назад", но мне, кажется, он не нужен, так как моя кнопка "Назад" работает нормально ...

6 голосов
/ 25 января 2013

Вы пытались переписать значение по умолчанию?

$(document).bind("mobileinit", function(){
    $.mobile.page.prototype.options.domCache = false;
});

Это работает для меня

5 голосов
/ 02 октября 2011

Кэширование страниц по умолчанию отключено в jQM RC1. Смотрите выдержку из веб-сайта jQM о кэшировании страниц: http://jquerymobile.com/demos/1.0rc1/docs/pages/page-cache.html

Если вы предпочитаете, вы можете указать jQuery Mobile сохранять ранее посещенные страницы в DOM, а не удалять их. Это позволяет вам кэшировать страницы, чтобы они были доступны мгновенно, если пользователь вернется к ним.

Чтобы сохранить все ранее посещенные страницы в DOM, установите для параметра domCache на плагине страницы значение true, например:

$.mobile.page.prototype.options.domCache = true;

В качестве альтернативы, чтобы кэшировать только определенную страницу, вы можете добавить атрибут data-dom-cache = "true" в контейнер страницы:

<div data-role="page" id="cacheMe" data-dom-cache="true">

Вы также можете программно кэшировать страницу следующим образом:

pageContainerElement.page({ domCache: true });

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

4 голосов
/ 12 января 2011

Метод 1

Это отключает AJAX

Чтение http://jquerymobile.com/demos/1.0a2/#docs/api/globalconfig.html

Установите ajaxLinksEnabled в false, и он не будет загружать и кэшировать эти страницы, просто работать как обычные ссылки.

Метод 2

Вторая идея - удалить кэшированные элементы. Вы можете привязаться к событию pagehide и заставить его удалить страницу. Если его нет в DOM, страница будет загружена снова.

Это можно сделать с помощью этого кода в качестве доказательства концепции:

$('.ui-page').live('pagehide',function(){ $(this).remove(); });

Но для этого нужно немного поработать. Приведенный выше код ломает историю. Это доказывает, что вы сможете использовать его только со страницами, которые вы собираетесь оставить в дереве карты сайта. Поэтому вам необходимо создать специальный селектор для них или привязать его только к определенным страницам.

Также вы можете привязать к событию click или mousedown кнопки, получить ее href, сгенерировать из нее идентификатор страницы и найти div по id, чтобы удалить ее, прежде чем jqm попытается ее найти.

Я не нашел рекомендуемого способа отключения кэша или принудительной загрузки.

2 голосов
/ 26 ноября 2012

Ответ Мартина должен быть правильным, на мой взгляд, но jQuery Mobile кэширует первую страницу, несмотря ни на что.https://github.com/jquery/jquery-mobile/issues/3249

Я решил "исправить" поведение $.mobile.page.prototype.options.domCache = false и data-dom-cache="true"

$(document).on('pagehide', function (e) {
    var page = $(e.target);
    if (!$.mobile.page.prototype.options.domCache
        && (!page.attr('data-dom-cache')
            || page.attr('data-dom-cache') == "false")
        ) {
        page.remove();
    }
});
1 голос
/ 26 июня 2011

Вот мое рабочее решение:

$('.selector').live( 'pagebeforecreate', function () {
    $.mobile.urlHistory.stack = [];
    $.mobile.urlstack = [];
    $( '.ui-page' ).not( '.ui-page-active' ).remove();
});

Я написал (оригинал на немецком языке) статью на эту тему, возможно, это поможет. Ссылка на перевод статьи в Google

...