Як встановити помилковий кеш для getJSON в jQuery?


80

Я використовую getJSONдля отримання результатів з боку сервера, але стикаюся з проблемами кешу браузера. Я хочу, щоб кеш був помилковим. Я спробував використовувати це безпосередньо перед своїм getJSONдзвінком.

 $.ajaxSetup({
                cache: false
            })

Але я не отримую очікуваних результатів. Це все ще показує старі результати.

Я також визначив деякі інші рішення, такі як використання, .ajaxале я дійсно не хочу цим користуватися.


Відповіді:


128

Для вашого коду просто потрібен тригер, щоб він був увімкнений.

Це дозволить вам вимкнути кеш-пам’ять у всіх майбутніх ajax

$(document).ready(function() {
  $.ajaxSetup({ cache: false });
});

Сподіваюся, це допоможе :)


7
Це відрізняє її у всьому світі, який погано , і може вплинути на інші виклики Ajax у вашій програмі , які роблять кешування потреби
VSync

@helloChris - ось гарне пояснення від jQuery "Сторінкою не можна безпечно маніпулювати, поки документ не буде" готовий ". jQuery виявляє для вас такий стан готовності. Код, що міститься всередині $ (document) .ready (), буде запущений лише один раз сторінка Модель об'єкта документа (DOM) готова до виконання коду JavaScript. " ЧИТАЙТЕ БІЛЬШЕ ПРО API
bonenatch

7
@bonesnatch Більшості коду jQuery це потрібно, правда, але це налаштування не має нічого спільного з DOM. Документ може знаходитись у будь-якому стані, коли ви налаштовуєте це налаштування, і, наскільки я можу зрозуміти, це не змінить. Немає маніпуляцій зі сторінками.
chris

Навіщо йому потрібен тригер? Поясніть, будь ласка, чому це не працює так, як це використовував оригінальний плакат?
Rune Jeppesen,

2
Естетичніший спосіб використання; $ .ajaxSettings.cache = false;
Мустафа Чакіроглу

83

Ви можете використовувати будь-що з цього, що вимкне кеш глобально:

$(document).ready(function() {
  $.ajaxSetup({ cache: false });
});

або замість того $.getJSON, щоб вимкнути кеш-пам’ять лише для такого запиту:

$.ajax({
    cache: false,
    url: "/path/to.json",
    dataType: "json",
    success: function(data) {
        ...
    }
});

50

Відповіді semente і bonesnatch правильні, але якщо ви хочете використовувати $ .getJSON та в інших місцях, скористайтеся перевагами його кешування (ви не хочете встановлювати кеш у значення false для всіх дзвінків), але ви хочете, щоб кеш було зруйновано лише для за один виклик можна вставити мітку часу у властивість даних $ .getJSON (). Додаючи унікальне значення до рядка запиту запиту, запит завжди буде унікальним і не буде кешований браузером - ви завжди отримуватимете останні дані.

Довга версія:

var ts = new Date().getTime();
var data = {_: ts};
var url = '/some/path.json';

$.getJSON(url, data);

Все в одній версії:

$.getJSON('/some/path', {_: new Date().getTime()});

Обидва результати мають такий запит:

/some/path.json?_=1439315011130 

де число в кінці є позначкою часу для моменту виклику коду і, отже, завжди буде унікальним.


2
Я б сказав далеко не найкраще рішення поставленої проблеми. Вам не потрібно міняти свій javascript, ніяких змін глобальної конфігурації, а лише простий додатковий параметр для переходу у функцію.
Кріс

Це не рішення, якщо ви використовуєте Azure CDN. Azure повертає кешований об'єкт, якщо ви надсилаєте додатковий параметр
levye
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.