Остановить кеширование ответа jQuery .load

214

У меня есть следующий код, создающий запрос GET по URL-адресу:

$('#searchButton').click(function() {
    $('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val());            
});

Но возвращаемый результат не всегда отражается. Например, я изменил ответ, который выплевывает трассировку стека, но трассировка стека не появилась, когда я нажал кнопку поиска. Я посмотрел на базовый PHP-код, который управляет ответом ajax, и у него был правильный код, и посещение страницы напрямую показало правильный результат, но результат, возвращаемый .load, был старым.

Если я закрою браузер и снова открою его, он будет работать один раз, а затем начнет возвращать устаревшую информацию. Могу ли я управлять этим с помощью jQuery или мне нужно, чтобы мои выходные заголовки PHP script контролировали кэширование?

Теги:
caching

14 ответов

379
Лучший ответ

Вам нужно использовать более сложную функцию типа $.ajax(), если вы хотите контролировать кеширование по принципу запроса. Или, если вы просто хотите отключить его для всего, поставьте его вверху вашего script:

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});
  • 1
    благодарю вас! Это даже находится в документации jQuery? Ааа ... нашел это. Вид ягодный. Это было ударом по заднице большую часть дня ... Еще раз спасибо!
  • 35
    Весь этот кеш: ложный делает добавление числа (я полагаю, это отметка времени) в конце URL при выполнении запроса. Другое место для обработки настроек кэша - от сервера или веб-приложения, устанавливая различные заголовки ответа HTTP, такие как Expires, Pragma и т. Д.
Показать ещё 11 комментариев
106

Вот пример того, как управлять кэшированием по каждому запросу

$.ajax({
    url: "/YourController",
    cache: false,
    dataType: "html",
    success: function(data) {
        $("#content").html(data);
    }
});
  • 7
    Мне нравится этот способ гораздо лучше, чем просто отключить кеширование.
  • 0
    Мне также нравится, что это не отключает все кэширование. Кроме того, посмотрите на этот пост также [ссылка] stackoverflow.com/questions/4245231/… для фильтрации.
Показать ещё 2 комментария
34

Один из способов - добавить уникальный номер в конец URL-адреса:

$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&uid='+uniqueId());

Где вы пишете uniqueId(), чтобы возвращать что-то другое при каждом вызове.

  • 3
    function uniqueId () {return new Date.getTime (); };
  • 1
    Еще проще, просто используйте (+new Date) (или new Date().getTime() если вы сторонник). Посмотрите, как вы получаете метку времени в JavaScript?
Показать ещё 3 комментария
7

Другой подход, чтобы поставить нижнюю строку только тогда, когда требуется получить данные с сервера, добавьте следующую строку вместе с вашим URL-адресом ajax.

? _ = '+ Math.round(Math.random() * 10000)

6
/**
 * Use this function as jQuery "load" to disable request caching in IE
 * Example: $('selector').loadWithoutCache('url', function(){ //success function callback... });
 **/
$.fn.loadWithoutCache = function (){
 var elem = $(this);
 var func = arguments[1];
 $.ajax({
     url: arguments[0],
     cache: false,
     dataType: "html",
     success: function(data, textStatus, XMLHttpRequest) {
   elem.html(data);
   if(func != undefined){
    func(data, textStatus, XMLHttpRequest);
   }
     }
 });
 return elem;
}
  • 0
    Это почти сработало для меня. За исключением того, что функция обратного вызова имеет неверное значение "this". Я изменил вызов func () на следующее, чтобы исправить это: func.call(elem, data, textStatus, XMLHttpRequest);
4

Саша - хорошая идея, я использую микс.

Я создаю функцию

LoadWithoutCache: function (url, source) {
    $.ajax({
        url: url,
        cache: false,
        dataType: "html",
        success: function (data) {
            $("#" + source).html(data);
            return false;
        }
    });
}

И вызовите для разных частей моей страницы, например, в init:

Init: function (actionUrl1, actionUrl2, actionUrl3) {

var ExampleJS = {

Init: function (actionUrl1, actionUrl2, actionUrl3)           ExampleJS.LoadWithoutCache(actionUrl1, "div1");

ExampleJS.LoadWithoutCache(actionUrl2, "div2" ); ExampleJS.LoadWithoutCache(actionUrl3, "div3" );   }  },

4

Это особенно раздражает IE. В основном вам нужно отправить HTTP-заголовки "no-cache" обратно с ответом с сервера.

2

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

$jqm(document).bind('pagebeforeload', function(event, data) {
    var url = data.url;
    var savePageInDOM = true;

    if (url.toLowerCase().indexOf("vacancies") >= 0) {
        savePageInDOM = false;
    }

    $jqm.mobile.cache =  savePageInDOM;
})

Этот код активируется перед загрузкой страницы, вы можете использовать url.indexOf(), чтобы определить, является ли URL-адрес тем, который вы хотите кэшировать или нет, и соответствующим образом установить параметр кэша.

Не использовать window.location = "; для изменения URL-адреса, иначе вы перейдете на адрес, а страница будет загружена не будет. Чтобы обойти эту проблему, просто используйте window.location.hash =" ";

  • 0
    выглядит хорошо, но AJAX-запросы не отправляются в любом случае
  • 1
    что такое $ jqm? $ Jqm = $? $ .mobile.cache не определен
2

Для PHP добавьте эту строку в свой script, который обслуживает нужную информацию:

header("cache-control: no-cache");

или, добавьте уникальную переменную в строку запроса:

"/portal/?f=searchBilling&x=" + (new Date()).getTime()
  • 0
    Опция cache: false в функции $ .ajax автоматически добавляет уникальную переменную в строку запроса, как ваше второе предложение.
1

Вы можете заменить функцию загрузки jquery версией с кешем, установленным на false.

(function($) {
  var _load = jQuery.fn.load;
  $.fn.load = function(url, params, callback) {
  if ( typeof url !== "string" && _load ) {
        return _load.apply( this, arguments );
  }
    var selector, type, response,
      self = this,
      off = url.indexOf(" ");

    if (off > -1) {
      selector = stripAndCollapse(url.slice(off));
      url = url.slice(0, off);
    }

    // If it a function
    if (jQuery.isFunction(params)) {

      // We assume that it the callback
      callback = params;
      params = undefined;

      // Otherwise, build a param string
    } else if (params && typeof params === "object") {
      type = "POST";
    }

    // If we have elements to modify, make the request
    if (self.length > 0) {
      jQuery.ajax({
        url: url,

        // If "type" variable is undefined, then "GET" method will be used.
        // Make value of this field explicit since
        // user can override it through ajaxSetup method
        type: type || "GET",
        dataType: "html",
        cache: false,
        data: params
      }).done(function(responseText) {

        // Save response for use in complete callback
        response = arguments;

        self.html(selector ?

          // If a selector was specified, locate the right elements in a dummy div
          // Exclude scripts to avoid IE 'Permission Denied' errors
          jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :

          // Otherwise use the full result
          responseText);

        // If the request succeeds, this function gets "data", "status", "jqXHR"
        // but they are ignored because response was set above.
        // If it fails, this function gets "jqXHR", "status", "error"
      }).always(callback && function(jqXHR, status) {
        self.each(function() {
          callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
        });
      });
    }

    return this;
  }
})(jQuery);

Поместите это где-нибудь глобальное, где оно будет работать после загрузки jquery, и вы должны быть настроены. Ваш существующий код загрузки больше не будет кэшироваться.

0

Если вы хотите придерживаться метода Jquery.load(), добавьте что-то уникальное в URL-адрес, например, метку времени JavaScript. "+ new Date(). getTime()". Заметьте, мне пришлось добавить "& time =", чтобы он не изменял вашу переменную pid.

$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&time='+new Date().getTime());            
});
0

Этот код может помочь вам

var sr = $("#Search Result");
sr.load("AJAX-Search.aspx?q=" + $("#q")
.val() + "&rnd=" + String((new Date).getTime())
.replace(/\D/gi, ""));
0

Я заметил, что если некоторые серверы (например, Apache2) не настроены на то, чтобы специально разрешить или запретить любое "кэширование", тогда сервер может по умолчанию отправлять "кэшированный" ответ, даже если вы установите заголовки HTTP на "no- кэш". Поэтому убедитесь, что ваш сервер не "кэширует" что-либо прежде, чем он отправит ответ:

В случае Apache2 вы должны

1) отредактируйте файл "disk_cache.conf" - чтобы отключить кеш, добавьте директиву "CacheDisable/local_files"

2) загрузить модули mod_cache (на Ubuntu "sudo a2enmod cache" и "sudo a2enmod disk_cache" )

3) перезапустите Apache2 (Ubuntu "sudo service apache2 restart" );

Это должно сделать трюк, отключающий кеш на стороне сервера. Ура!:)

0

Попробуйте следующее:

$("#Search_Result").load("AJAX-Search.aspx?q=" + $("#q").val() + "&rnd=" + String((new Date()).getTime()).replace(/\D/gi, ''));

Он отлично работает, когда я его использовал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню