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

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

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

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

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

Ответ 1

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

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});

Ответ 2

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

$.ajax({
    url: "/YourController",
    cache: false,
    dataType: "html",
    success: function(data) {
        $("#content").html(data);
    }
});

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

/**
 * 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;
}

Ответ 6

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

Ответ 7

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

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

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" );   }  },

Ответ 8

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

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

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

"/portal/?f=searchBilling&x=" + (new Date()).getTime()

Ответ 9

НЕ используйте временную метку для создания уникального 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 =" ";

Ответ 10

Вы можете заменить функцию загрузки 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, и вы должны быть настроены. Ваш существующий код загрузки больше не будет кэшироваться.

Ответ 11

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

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

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

Ответ 12

Я заметил, что если некоторые серверы (например, 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" );

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

Ответ 13

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

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

Ответ 14

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

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