2013-09-30 55 views
0

我已经通过点击事件加载了一个带有子类别列表的弹出式菜单。ajax加载后从缓存中加载数据

例如:有10个主类别,每个类别都有很多子类别列表,并且它由ajax在弹出窗口中加载。当我点击类别A时,它加载了类别A的子类别,当我移动到类别B时,它加载类别B的子类别,当我回来时再次点击类别A再次请求到服务器,并且需要相同的时间加载。

我需要从缓存中加载这些数据。当我再次在ajax函数中设置cache: true时,它仍然会加载并发送请求。

我不需要再向服务器请求相同的数据,即。类别A.有没有办法做到这一点?

如果由于没有互联网连接而失败,又是否可以重新请求服务器?

代码:

$.ajax({ 
    url:'/category/list/', 
    data:'catid='+$(".category").attr('data-id'), 
    cache: true, 
    dataType:'json', 
    beforeSend:function() 
    { 
    $(".subcatlist").html('<div class="loader">loading...</div>'); 
    } 
    success:function(json){ 
    $(".loader").remove(); 
    $(".subcatlist").html(json.sublist); 
    } 
    error:function() 
    { 
    console.log('error'); 
    } 

}); 
+0

接收php脚本是什么样的?哪些头文件是由php脚本发送的? – TheWolf

+0

我已经加载了json数组中的html。我没有在代码中定义任何头文件。可能默认情况下它会加载一个json类型的内容。 – shyammtp

回答

0

我用在我的脚本文件的顶部,例如:function.js/default.js/admin.js,或之后<script type="text/javascript">标签。

$.ajaxSetup ({ 
    // Enable caching of AJAX responses 
    cache: true 
}); 
+0

我已经在我的函数中定义了缓存:true。你可以告诉我两者有什么区别? – shyammtp

+0

我知道,如果ajaxSetup在Internet Explorer中不使用缓存仍在工作(或没有)。在其他浏览器中,缓存选项本身起作用。 –

2

在你的PHP脚本接收Ajax调用的最顶端尝试类似的东西:

header("Cache-Control: maxage=".date(DATE_RFC822,strtotime("+2 day")); 
header("Pragma: private"); 
header("Expires: " . date(DATE_RFC822,strtotime("+2 day"))); 

这应该告诉浏览器的Ajax调用可以被缓存两天的结果。