Можно ли очистить jQuery ajax кэш?

Я задаюсь вопросом, возможно ли очистить кэш от конкретного метода Ajax.

Скажите, что у меня есть это:

$.ajax({
  url: "test.html",
  cache: true,
  success: function(html){
    $("#results").append(html);
  }
});

Теперь 99% времени, кэшируемый результат может использоваться, так как он должен всегда иметь то же содержание. Однако, если пользователь обновляет это содержание, оно (конечно), изменяется. Если бы это кэшируется, это все еще показало бы старое содержание.

Так, было бы здорово, если бы я мог бы выбрать этот кэш для этого метода и очистить его и все другие, кэшируемый материал остался бы.

Это может быть сделано?

Править

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

Моя проблема состоит в том, что я хочу, чтобы это кэшировалось, пока кто-то не делает обновление его. Затем это не должно кэшироваться, пока они не нажимают на него снова. Затем это должно кэшироваться снова.

В основном у меня есть диалоговое окно модели обновления (jQuery UI), который поднимает форму обновления так, чтобы пользователи могли обновить строку таблицы. Когда они нажимают "Update", он обновляет ту строку таблицы. Теперь один столбец может иметь, как, несколько ценности абзацев данных, и это заставляет таблицу выглядеть плохо.

Таким образом для сохранения таблицы я имею в, он - место ссылка, названная "Выставочные Данные". Теперь, когда это нажато, диалоговая модель втискивают шоу, и данные вытягивают с сервера.

Если они нажимают на него 5 раз, это становится перезагруженным 5 раз. Вот почему я хочу кэшировать его. Однако, если они нажмут на него, и это кэшируется затем по любой причине, они идут и обновляют ту строку и нажимают на "Show Data", то они получат кэшированную версию, не обновленную версию.

Я мог, вероятно, скрыть все абзацы и показать им на желании с помощью jQuery, но у меня скорее будет он по требованию. Иначе будет так много скрытого дерьма, и оно замедлится, страница (вообразите, есть ли у некоторого парня 50 строк, и каждый из тех столбцов имеет как 1 000 символов).

8
задан RustyTheBoyRobot 16 August 2012 в 22:05
поделиться

1 ответ

Вы неправильно понимаете параметр по умолчанию cache: true для $. Ajax . В документации вы найдете следующее:

Если установлено значение false, страницы, которые вы просите не быть кешируется браузером.

Чтобы понять, что на самом деле делает этот параметр, вам следует взглянуть на исходный код jQuery:

if ( s.cache === false && type === "GET" ) {
    var ts = now();

    // try replacing _= if it is there
    var ret = s.url.replace(rts, "$1_=" + ts + "$2");

    // if nothing was replaced, add timestamp to the end
    s.url = ret + ((ret === s.url) ?
            (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
}

Итак, если вы используете cache: false , jQuery просто добавляет дополнительный параметр к URL-адресу с текущим временем . Затем браузер видит другой URL-адрес и решает, что в его кеше нет данных с этим URL-адресом, поэтому он перенаправляет запрос на сервер. Больше ничего.

ОБНОВЛЕНО на основе Отредактированной части вопроса: Если я правильно вас понял, вы хотите использовать локальный кеш браузера, но хотите управлять им. В таком случае следует использовать значение по умолчанию cache: true (не добавляйте этот параметр в $. Ajax ). Вместо зависимости от $.ajax () , вы должны добавить дополнительную информацию о кешировании в ответ вашего сервера. Браузеры всегда будут явно следовать инструкциям кеширования, как они написаны в соответствующем заголовке страницы.

Так, например, вы можете добавить время в заголовок ответа, определяющее, как долго страница действительна. Это очень эффективно, если вам не нужна самая последняя версия данных на клиенте (см. http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html ).

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

  1. «Cache-Control» установлен на «max-age = 0», что отключает локальное кеширование
  2. «Etag» с некоторым значением (например, хеш MD5 отправленных данных), чтобы определить, что данные содержат. Значение абсолютно бесплатное, вы можете рассчитать его как хотите, но два разных ответа должны иметь разные значения Etag.

Этот метод очень хорош для динамического содержимого (например, для ответа на основе данных из базы данных), если вы хотите всегда иметь самую последнюю версию данных, но не хотите, чтобы сервер отправлял данные еще раз, если он не изменился с момента последнего ответа. Если вы последуете этому методу, браузер (каждый браузер) добавит к заголовку данных, отправляемых на сервер, при втором нажатии кнопки «Показать данные» значение «Etag» из локального кэширования страницы, размещенного внутри «Если -None-Match " Заголовок HTTP-запроса. Затем сервер может определить, изменяются ли данные.В противном случае сервер может ответить пустым ответом и «304 Not Modified» вместо «200 OK» . Браузер знает об этом и получает данные прямо из местной кассы. Таким образом, ваш запрос $. Ajax будет успешно завершен, и вы получите данные из местной кассы.

Конечно, вы можете комбинировать два пути. Просто установите вместо «max-age = 0» какое-нибудь ненулевое значение, которое является временем в секундах, в течение которого действительна локальная наличность (см. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14 .html # sec14.9.3 )

10
ответ дан 5 December 2019 в 17:34
поделиться
Другие вопросы по тегам:

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