Як встановити кеш: false у виклику jQuery.get


75

jQuery.get()це скорочення для jQuery.ajax()отримання дзвінка. Але коли я встановлюю cache:falseдані .get()виклику, на сервер надсилається параметр, який називається кеш зі значенням false. Хоча я маю намір відправити мітку часу з даними на сервер, щоб запобігти кешуванню, що саме відбувається, якщо я використовую cache: falseдані jQuery.ajax. Як мені це зробити, не переписуючи свої дзвінки jQuery.get на виклики jQuery.ajax або використовуючи

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

оновлення: Дякуємо усім за відповіді. Ви всі праві. Однак я сподівався, що є спосіб повідомити отриманий виклик, що ви не хочете кешувати, або надіслати це значення базовому файлу .ajax (), щоб він знав, що з ним робити.

Я а. шукає четвертий шлях, крім трьох способів, які були визначені до цього часу:

  1. Робить це глобально за допомогою ajaxSetup

  2. Використання виклику .ajax замість виклику .get

  3. Роблячи це вручну, додавши новий параметр із позначкою часу до вашого виклику .get.

Я просто подумав, що цю можливість слід вбудувати у виклик .get.


1
Показати повний get()приклад?
Живінгс

Мені подобається передавати дату / час файлу зі сторінкою (припускаючи, що я використовую мову сценаріїв на стороні сервера), а потім передати це із запитом на сторінку як параметр рядка запитів. Причиною цього є те, що це дозволяє кешування, якщо сторінка насправді не змінилася.
Поновити Моніку Челліо

1
Використання кешу: false додає позначку часу до запиту ajax / json, наприклад {"get": "modified"} & _ = 1394836303603, що порушило мої запити API. Занадто багато годин знадобилося, щоб зрозуміти, що додає позначку часу, оскільки вона похована в документах jQuery. Замість того, щоб використовувати cache: false, просто додайте власну мітку часу, припускаючи, що вашому API буде байдуже, якщо ви додасте невідомий параметр. Ось так: {"get": "modified", "timestamp": "1394836303603"} Це також дозволяє точніше контролювати, які елементи кешуються, а які ні.
Jim Bergman

Чому ви не хочете використовувати $ .ajaxSetup? Це прямий шлях вперед і робить роботу.
корисний Бджола

Відповіді:


36

Для мене правильним способом зробити це будуть перелічені. Або ajaxабо ajaxSetup. Якщо ви дійсно хочете використовувати, getа не використовувати, ajaxSetupви можете створити власний параметр і надати йому значення поточної дати / часу.

Однак я б поставив під сумнів ваші мотиви, якщо не використати жоден з інших методів.


1
Варто зазначити, що в моєму конкретному додатку я використовую cache: false у ajaxSetup (більшість моїх викликів стосується кінцевих точок json для корисних навантажень), а потім я використовую $ .ajax (..., cache: true) для будь-яких конкретних шаблонів чи речей що я хочу кешувати. Я все одно віддаю перевагу цьому, оскільки це робить речі досить явними, і я називаю більше викликів корисного навантаження, ніж статичних даних.
Девід

109

Додайте параметр самостійно.

$.get(url,{ "_": $.now() }, function(rdata){
  console.log(rdata);
});

Станом на jQuery 3.0, тепер ви можете зробити це:

$.get({
  url: url, 
  cache: false
}).then(function(rdata){
  console.log(rdata);
});

6
дякую $ .now () - це скорочення нового Date (). getTime (). api.jquery.com/jQuery.now
Barka

1
Тепер ви також можете це зробити Date.now().
Живінгс

2
або, оскільки у нас є jquery, просто використовуйте те, що у нас є. :)
Kevin B

1
Це має бути прийнятою відповіддю ... оскільки ОП запитував конкретно про$.get();
Сержа Сагана

1
@SerjSagan, я з цим не погоджуюсь, оскільки до jQuery 3.0 кращим варіантом було б використовувати $ .ajax. в 3.0, $ .get також може приймати об'єкт options. :)
Kevin B

64

Я думаю, що вам натомість потрібно використовувати метод AJAX, який дозволяє вимкнути кешування:

$.ajax({
  url: "test.html",
  data: 'foo',
  success: function(){
    alert('bar');
  },
  cache: false
});

2
IE9 кешує і, схоже, насправді не подобається .get
Росс

4
@Ross Це не повинно робити, якщо ви встановили значення відповідно cacheдо falseмоєї відповіді.
Живінгс,

2
Через 3 роки, і я просто втратив півдня через ту саму проблему
Джоель,

@ Джоел Ха-ха, радий, що я міг допомогти :)
Живінгс

7

Згідно з документацією JQuery, в якості параметрів .get()береться лише url, data(вміст) dataTypeта successзворотний виклик. Що ви насправді хочете тут зробити, це змінити об’єкт jqXHR до того, як він буде надісланий. З .ajax(), це робиться за допомогою beforeSend()методу. Але оскільки .get()це ярлик, він не дозволяє цього.

Переключити .ajax()дзвінки на порівняно легко.get() дзвінки . Зрештою, .get()це лише підмножина .ajax(), тому ви, ймовірно, можете використовувати всі значення за замовчуванням для .ajax()(крім, звичайно, для beforeSend()).

Редагувати:

:: Дивиться на відповідь Дживінгса ::

О так, забув про cacheпараметр! Хоча beforeSend()це корисно для додавання інших заголовків, вбудований cacheпараметр тут набагато простіший.


5

Встановіть кеш: false у виклику jQuery.get, використовуючи метод нижче

використовуйте new, Date().getTime(),який дозволить уникнути зіткнень, якщо у вас не буде декількох запитів, що відбуваються протягом однієї мілісекунди.

Або

Далі буде запобігати кешуванню всіх майбутніх запитів AJAX незалежно від того, який метод jQuery ви використовуєте ($ .get, $ .ajax тощо).

$.ajaxSetup({ cache: false });

3

Зверніть увагу, що синтаксис зворотного виклику застарілий :

Повідомлення про застарівання

Методи зворотного виклику jqXHR.success (), jqXHR.error () та jqXHR.complete (), введені в jQuery 1.5, застаріли станом на jQuery 1.8. Щоб підготувати свій код до їх остаточного видалення, використовуйте jqXHR.done (), jqXHR.fail () та jqXHR.always ().

Тут модернізоване рішення з використанням promiseінтерфейсу

$.ajax({url: "...", cache: false}).done(function( data ) {
    // data contains result
}).fail(function(err){
    // error
});

0

Я дуже пізно в грі, але це може допомогти іншим. Я зіткнувся з цією ж проблемою з. Тож після невеликого дослідження я виявив, що ви можете просто використовувати $ .post замість $ .get, який НЕ використовує кешування. Просто як це. :)


Я теж запізнився :) дякую за ваш внесок, він працює нормально
Angel M.

3
Це погана порада, оскільки GET та POST - це різні дієслова, і їх слід використовувати для різних речей. Ця ж URL-адреса сервера може фільтруватися за дієсловами, тому, наприклад, POST не працюватиме, якщо сервер очікує лише GET. Або ще гірше, сервер може мати різну поведінку для GET та POST (що дуже поширене насправді).
Ендрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.