在此示例中,您可以看到生成的HTML列表。每次刷新时,脚本都会请求数据文件(ajax / test.json)并再次构建列表。
生成的文件“ajax / test.json”是静态缓存的。但是,如何在每次刷新时避免请求此文件?
// source: jquery.com
$.getJSON('ajax/test.json', function(data) {
var items = [];
$.each(data, function(key, val) {
items.push('<li id="' + key + '">' + val + '</li>');
});
$('<ul/>', {
'class': 'my-new-list',
html: items.
}).appendTo('body');
});
不有效:
list_data = $.cookie("list_data");
if (list_data == undefined || list_data == "") {
$.getJSON('ajax/test.json', function(data) {
list_data = data;
});
}
var items = [];
$.each(data, function(key, val) {
items.push('<li id="' + key + '">' + val + '</li>');
});
$('<ul/>', {
'class': 'my-new-list',
html: items.
}).appendTo('body');
提前致谢!
答案 0 :(得分:7)
如何承诺?
var list_data = localStorage.getItem("list_data"),
def = $.Deferred();
if (!list_data) {
def = $.getJSON('ajax/test.json', function(data) {
list_data = data;
localStorage.setItem("list_data", JSON.stringify(list_data));
});
}else{
list_data = JSON.parse(list_data);
def.resolve();
}
def.done(function() {
var items = [];
$.each(list_data, function(key, val) {
items.push( $('<li />', {id: key, text: val}) );
});
$('<ul/>', {'class': 'my-new-list'}).html(items).appendTo('body');
});
我也只使用本地存储,如果要支持IE7或更低版本,请使用MDN上提供的垫片!
答案 1 :(得分:1)
因为您的代码循环遍历data
,而$.each
不在您list_data = $.cookie("list_data");
function buildList(data) {
var items = [];
$.each(data, function(key, val) {
items.push('<li id="' + key + '">' + val + '</li>');
});
$('<ul/>', {
'class': 'my-new-list',
html: items.
}).appendTo('body');
}
//if we dont have list data
if (!list_data) {
//request for the data
$.getJSON('ajax/test.json', function(data) {
list_data = data;
//build list using new data
buildList(data);
});
} else {
//or use existing list data
buildList(list_data)
}
的范围内。代替:
{{1}}
答案 2 :(得分:1)
请注意,如果您停留在同一页面上,则不需要cookie - 可以将其存放在某个对象中:
window.list_data = data;
如果您需要稍后检索数据,或者在刷新页面之后,请使用cookie。但是你需要序列化它,因为它不可能在cookie中存储一个对象:
// retrieve
list_data = $.cookie("list_data");
if (list_data) {
// have to de-serialize from string to object
list_data = JSON.parse(list_data);
} else {
// doesn't exist in cookie, make AJAX call
}
// save
$.cookie("list_data", JSON.stringify(data));
答案 3 :(得分:1)
您可以让浏览器正常缓存文件,请参阅jQuery ajax docs:
http://api.jquery.com/jQuery.ajax/
jQuery.ajax( settings )
cache
Boolean
Default: true, false for dataType 'script' and 'jsonp'
If set to false, it will force requested pages not to be cached by the browser.
Setting cache to false also appends a query string parameter, "_=[TIMESTAMP]", to the URL.
如果我理解正确,getJson只是一个ajax调用的抽象,特别是对于json。您应该尝试将其设置为true,这将使浏览器正常缓存。
将它放入cookie也可以,但最大大小为4kb。我假设你的json不是那么大。
答案 4 :(得分:1)
我自己做了一些研究,现在似乎可以在现代浏览器中使用localStorage或sessionStorage对象来存储对象一段时间。两者都有它的限制。通常,localStorage和sessionStorage对象的限制为5mb。数据在窗口/选项卡的整个生命周期中都是持久的。今天支持(currently 89%)浏览器并不算太糟糕。
sessionStorage和localStorage共享相同的API。因此,选择在本地存储数据的位置取决于您的用例。
if (!sessionStorage.myapp) {
var xhr = new XMLHttpRequest(),
results = {}; // Results of xhr request
// ...
// store your xhr results to sessionStorage.
// Both sessionStorage and localStorage can only store strings.
sessionStorage.setItem('myapp', JSON.stringify(results));
}
我也会因为尺寸限制(4K)而避免使用Cookie,也因为Cookie会在每次交易后传回服务器。
Sitepoint对于当前现有的网络存储API来说是一个非常好的资源:http://www.sitepoint.com/an-overview-of-the-web-storage-api/