先我们来看看jquery的ajax缓存问题
jquery的ajax请求默认请求cache是true 也就是开启的,dataType为script和jsonp时默认为false。现在我要在浏览器里读取缓存,因为ajax请求的数据很大,请求一次就够了。但是问题来了,在FF里面,是没有ajax缓存的,也就是每次都会触发ajax请求,这点和IE不一样。所以在这里就得注意,做个判断,阻止触发ajax事件。
function ajax_show(apartId,roomClass,sortTile){ HX_THIS_FANGXING_NUM=sortTile; huxing_pic_set_color(); var this_li=$('#title_'+sortTile); var cache=this_li.data("cache"); if(undefined!=cache){ var data_arr =cache.split('-'); xg_pic_links=data_arr[0];//缓存记录 layout_pic_links=data_arr[1]; layout_big_pic_links=data_arr[2]; product_links=data_arr[3]; xg_pic_deal_array(); xg_show_pic(xg_now_pic_id); }else{ $.ajax({//用JQ的缓存cache在FF下还是会发起新请求 type: "POST", url: "index.php?m=content&c=index&a=ajax_all_pic", data: "apartId=123&roomClass=123", dataType:'text', success: function(backdata){ this_li.data('cache',backdata);//缓存记录 var data_arr =backdata.split('-'); xg_pic_links=data_arr[0]; layout_pic_links=data_arr[1]; layout_big_pic_links=data_arr[2]; product_links=data_arr[3]; xg_pic_deal_array(); xg_show_pic(xg_now_pic_id); } }); } }
通过 this_li.data('cache',backdata);//缓存记录 ,来做标记
缓存解释
jQuery全局对象里的ajax方法提供了一些options来支持缓存和Conditional GETs功能。
$.ajax({ ifModified: [true|false], cache: [true|false], });
ifModified选项定义的是在ajax调用的时候是否支持Conditional GETs功能。jQuery会自动帮我们处理服务器端返回的名为Last-Modified的header值,然后在随后的请求里的header里发送If-Modified-Since。这需要我们的MVC Controller要实现Conditional GETs功能才能用。Conditional GETs功能在http缓存上下文中用于重新验证缓存中过期的条目。如果jQuery认为一个条目已经过期了,它首先会请求服务器使用Conditional GETs功能重新验证该条目,如果服务器返回状态码304(Not modified),jQuery会重新使用缓存里的该项目,这样的话,我们可以节约很多流量去下载页面内容。
cache选项基本上是覆盖服务器端返回的http header里的所有关于缓存的设置,如果设置cache选项为false的话,jQuery会在请求的URL后面附件一个时间戳,以便区分之前的URL地址,这样没错请求的内容都是最新的,也就是说浏览器每次接收的都是新地址,自然返回的都是最新数据。
让我们来看几个场景:
服务器端响应里设置No-Cache
服务器端为王,如果服务器端明确定义了response响应不能被缓存的话,jQuery也无能为力。ajax里的cache选项将被忽略。
JS代码:
$(‘#nocache‘).click(function () { $.ajax({ url: ‘/Home/NoCache‘, ifModified: false, cache: true, success: function (data, status, xhr) { $(‘#content‘).html(data.count); } }); });
C#代码:
public ActionResult NoCache() { // 禁用缓存 Response.Cache.SetCacheability(HttpCacheability.NoCache); return Json(new { count = Count++ }, JsonRequestBehavior.AllowGet); }
服务器端响应里设置过期时间
服务器端设置过期时间用于缓存数据,该条目在客户端将依据过期时间被缓存。
JS代码:
$(‘#expires‘).click(function () { $.ajax({ url: ‘/Home/Expires‘, ifModified: false, cache: true, success: function (data, status, xhr) { $(‘#content‘).html(data.count); } }); });
C#代码:
public ActionResult Expires() { Response.Cache.SetExpires(DateTime.Now.AddSeconds(5)); return Json(new { count = Count++ }, JsonRequestBehavior.AllowGet); }
客户端从来不缓存数据
客户端决定每次都要最新的数据(不能使用缓存),也就是说ajaxi里的cache选项设置为false,不管服务器端如何定义,jQuery每次请求的URL地址都是唯一不同的,目的是每次都获取最新的内容。
JS代码:
$(‘#expires_nocache‘).click(function () { $.ajax({ url: ‘/Home/Expires‘, ifModified: false, cache: false, // 这里是关键 success: function (data, status, xhr) { $(‘#content‘).html(data.count); } }); });
C#代码:
public ActionResult Expires() { // 不管服务器端怎么设置都没用 Response.Cache.SetExpires(DateTime.Now.AddSeconds(5)); return Json(new { count = Count++ }, JsonRequestBehavior.AllowGet); }
服务器端和客户端使用Conditional Gets功能验证缓存数据
客户端将条目放在缓存里,在过期之后重新验证。服务器端必须实现Conditional GET功能(使用ETags或者last modified的header)。
JS代码:
$(‘#expires_conditional‘).click(function () { $.ajax({ url: ‘/Home/ExpiresWithConditional‘, ifModified: true, // 这里是关键 cache: true, success: function (data, status, xhr) { $(‘#content‘).html(data.count); } }); });
C#代码:
public ActionResult ExpiresWithConditional() { if (Request.Headers["If-Modified-Since"] != null && Count % 2 == 0) { return new HttpStatusCodeResult((int)HttpStatusCode.NotModified); } Response.Cache.SetExpires(DateTime.Now.AddSeconds(5)); Response.Cache.SetLastModified(DateTime.Now); return Json(new { count = Count++ }, JsonRequestBehavior.AllowGet); }
上述MVC action中的代码只是一个例子(非真实代码),在真实的实现中,服务器端应该能够知道数据自从上次响应以后是否被修改过。
我最强舞者 (I, Best Dancer)安卓版v8
我最强舞者(I, Best Dancer)是一款休闲放置类手
迷你世界国服版本2024 v1.43.0
迷你世界国服版本2024是一款自由度非常高的沙盒游戏,玩法和
烹饪乐园 安卓版v1.23.6
烹饪乐园(Cooking Town)是一款非常好玩的餐厅模拟
迷你世界小米服 最新安卓版v1.43.0
迷你世界小米版是由迷你玩科技开发的休闲模拟经营类游戏。此版本
布娃娃Sprunki沙盒 安卓版v0.0.1
布娃娃Sprunki沙盒是一个非常有趣的沙盒游戏,复古简约的