Отключить кеш в ajax load [duplicate]

Ваш Javascript будет выполняться на клиенте, а не на сервере. Это означает, что foo не оценивается на стороне сервера, и поэтому его значение не может быть записано в файл на сервере.

Лучший способ подумать об этом процессе - это как будто вы генерируя текстовый файл динамически. Текст, который вы генерируете, становится исполняемым кодом после того, как браузер интерпретирует его. Только то, что вы размещаете между тегами <?php, оценивается на сервере.

Кстати, создание привычки встраивать случайные фрагменты PHP-логики в HTML или Javascript может привести к серьезному запутанному коду. Я говорю от болезненного опыта.

235
задан dragonmantank 3 October 2008 в 22:23
поделиться

14 ответов

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

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});
404
ответ дан John Millikin 24 August 2018 в 04:54
поделиться
  • 1
    Спасибо! Является ли это даже в документации jQuery? Ahh ... нашел это. Вид испещрен. Это было ногами в течение большей части дня ... Еще раз спасибо! – bytebender 19 February 2010 в 21:30
  • 2
    Весь этот кеш: false делает, добавляет число (я считаю его timestamp) до конца URL-адреса при выполнении запроса. Другое место для обработки настроек кэша - это сервер или веб-приложение, устанавливая различные заголовки HTTP-ответа, такие как Expires, Pragma и т. Д. ... – Bryan Rehbein 15 March 2010 в 15:35
  • 3
    Эта информация мне очень помогла - она ​​помогла мне найти действительно искажающую ошибку – Luke101 10 May 2010 в 03:37
  • 4
    Любить это! Теперь мне не нужно использовать чрезмерно многословные вызовы .ajax и использовать ярлыки! – Gattster 1 June 2011 в 02:05
  • 5
    Brilliant - я нашел эту функцию, но не знал, что это сработает над чем-то таким же простым, как загрузка текстового документа в div с использованием .load – Dan 25 January 2012 в 18:35

Вы можете заменить функцию загрузки 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's a function
    if (jQuery.isFunction(params)) {

      // We assume that it's 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, и вы должны быть настроены. Ваш существующий код загрузки больше не будет кэшироваться.

1
ответ дан Adam Bell 24 August 2018 в 04:54
поделиться

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

var sr = $("#Search Result");
sr.load("AJAX-Search.aspx?q=" + $("#q")
.val() + "&rnd=" + String((new Date).getTime())
.replace(/\D/gi, ""));
0
ответ дан Ahmad Dwaik 'Warlock' 24 August 2018 в 04:54
поделиться

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

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

7
ответ дан Gomes 24 August 2018 в 04:54
поделиться

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

$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&time='+new Date().getTime());            
});
0
ответ дан Konrad Tallman 24 August 2018 в 04:54
поделиться

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

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

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

34
ответ дан Lou Franco 24 August 2018 в 04:54
поделиться
  • 1
    function uniqueId () {return new Date.getTime (); }; – Adam 16 June 2011 в 17:54
  • 2
    Еще проще, просто используйте (+new Date) (или new Date().getTime(), если вы приверженец). См. . Как получить метку времени в JavaScript? – thirdender 4 January 2014 в 01:58
  • 3
    Это решение не сработало для меня. – spadelives 6 May 2015 в 15:10
  • 4
    Задайте новый вопрос и поместите его здесь. Если вы сделали это правильно, вы генерируете совершенно новые URL-адреса, поэтому браузеры не могут быть кэшированы браузером. – Lou Franco 6 May 2015 в 19:09
  • 5
    использовал это для решения проблемы, не связанной с ней. работает угощение. – Alex 14 February 2017 в 05:35

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

Создаю функцию

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

5
ответ дан NGRAUPEN 24 August 2018 в 04:54
поделиться

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

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

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

"/portal/?f=searchBilling&x=" + (new Date()).getTime()
2
ответ дан nickf 24 August 2018 в 04:54
поделиться
  • 1
    Опция cache: false в функции $ .ajax автоматически добавляет уникальную переменную в строку запроса, как и ваше второе предложение. – Bryan Rehbein 15 March 2010 в 15:36
/**
 * 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
ответ дан Sasha 24 August 2018 в 04:54
поделиться
  • 1
    Это почти трюк для меня. За исключением того, что функция обратного вызова имеет неверный «этот», стоимость. Я изменил вызов func () следующим образом: func.call(elem, data, textStatus, XMLHttpRequest); – GeekyMonkey 25 February 2011 в 14:58

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

$.ajax({
    url: "/YourController",
    cache: false,
    dataType: "html",
    success: function(data) {
        $("#content").html(data);
    }
});
104
ответ дан Seybsen 24 August 2018 в 04:54
поделиться
  • 1
    Мне нравится этот путь намного лучше, чем просто отключить все кэширование. – Paul Tomblin 22 November 2010 в 23:33
  • 2
    Мне также нравится это, чтобы не отключать все кэширование. Кроме того, посмотрите на это сообщение также [link] stackoverflow.com/questions/4245231/… для фильтрации. – Dan Doyon 14 March 2011 в 19:50
  • 3
    @Marshall код здесь, у вас не упоминается POST или Get type ......, а что по умолчанию для jquery? – Thomas 2 March 2016 в 13:14
  • 4
    метод по умолчанию - GET – Rich T. 3 April 2018 в 20:54

Я заметил, что если некоторые серверы (например, 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
ответ дан techexpert 24 August 2018 в 04:54
поделиться

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

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

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

0
ответ дан user 24 August 2018 в 04:54
поделиться

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

2
ответ дан user1545320 24 August 2018 в 04:54
поделиться
  • 1
    выглядит хорошо, но в любом случае запросы ajax не отправляются – Luciuz 19 February 2013 в 09:18
  • 2
    что такое $ jqm? $ Jqm = $? $ .mobile.cache не определено – Luciuz 19 February 2013 в 09:34

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

4
ответ дан Xian 24 August 2018 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: