Как установить кеширование false для 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. Документ может быть в любом состоянии, когда вы устанавливаете эту настройку, и, насколько я могу судить, это не имеет значения. Нет никаких манипуляций со страницами.
Крис

Зачем нужен триггер? Пожалуйста, объясните, почему это не работает так, как на оригинальном плакате?
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 и bonenatch верны, но если вы хотите использовать $ .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.