Кэшировать ответ JSON

Я использую какой-либо сервис GeoIP для размещения флага страны на страницах в зависимости от IP страны. И мне нужно кэшировать ответ JSON для всех страниц моего сайта.

Этот код помещен в header.php:

$.getJSON('http://smart-ip.net/geoip-json?callback=?', function(data) {
  $('#flag').html("<a class='fancybox-inline int' href='#international'><img src='/images/flags/"+data.countryCode+".png'></a>");
  }

Можно ли его кэшировать с помощью $.ajaxSetup({ cache: true })? - вроде не работает.

Или, возможно, лучше использовать локальное хранилище HTML5, но я не уверен, как это сделать.

Я также попробовал плагин JSONCache, но он мне не помог.


person Dmitry    schedule 29.06.2013    source источник
comment
попробуйте использовать $.ajax, у него есть функциональность, которую вы ищете.   -  person Manish    schedule 29.06.2013
comment
@Mac $.getJSON — это ajax-запрос к службе, которая специально возвращает JSON. Это метод быстрого доступа, поэтому вам не нужно указывать type: 'JSON' ergo - он использует ajax;)   -  person ddavison    schedule 29.06.2013


Ответы (2)


Вы можете использовать localStorage следующим образом:

var smartIp = JSON.parse(localStorage.getItem('smartIp'));

if (!smartIp) $.getJSON('http://smart-ip.net/geoip-json?callback=?', function (data) {
    smartIp = localStorage.setItem('smartIp', JSON.stringify(data));
});

ДЕМО

Итак, в вашем конкретном случае вы должны использовать этот код на своей странице header.php:

var smartIp = JSON.parse(localStorage.getItem('smartIp'));

if (!smartIp) $.getJSON('http://smart-ip.net/geoip-json?callback=?', function (data) {
    smartIp = localStorage.setItem('smartIp', JSON.stringify(data));
    $('#flag').html("<a class='fancybox-inline int' href='#international'><img src='/images/flags/" + data.countryCode + ".png'></a>");
});
else $('#flag').html("<a class='fancybox-inline int' href='#international'><img src='/images/flags/" + smartIp.countryCode + ".png'></a>");
person A. Wolff    schedule 29.06.2013
comment
@kasperTaeymans, ты имеешь в виду «ненужный» вместо этого? Но localstorage может хранить только строку, а не объект javascript, так как бы вы сделали это без «sringified» объекта js? - person A. Wolff; 05.01.2014
comment
Максимум, что вы можете сэкономить таким образом, составляет 5 МБ на домен. diveintohtml5.info/storage.html - person vumaasha; 05.12.2014

$.getJSON() эквивалентно

$.ajax({
  dataType: "json",
  url: 'http://smart-ip.net/geoip-json/ip_address',
  data: data,
  success: function(data){ // do something here }
});

В этой форме вы можете добавить дополнительные параметры, такие как cache:true или любые другие параметры $.ajax, которые могут вам понадобиться.

person Community    schedule 29.06.2013
comment
Это на самом деле тоже работает, но я предпочитаю решение localStorage. Спасибо - person Dmitry; 29.06.2013