2013-12-18 57 views
1

我使用jQuery的$.ajax()方法来发布基于XHR的HTTP GET以从Ruby on Rails站点检索部分HTML。在这种特殊情况下,无论何时使用点击标签导航,我都会使用从服务器返回的数据更新HTML表格。问题是,一旦数据在服务器上可用,它就永远不会改变。当用户从一个标签点击到下一个标签时,它不必要地向服务器发出更多的XHR请求,以获取它应该已经拥有和/或被缓存的数据。我尝试使用cache: true属性,但我认为这不像我认为的那样。这里是我的脚本的例子:jQuery ajax缓存响应

$.ajax({ 
     url: "/nba/value_charts/" + site_id + "/" + t_date, 
     cache: true 
    }) 
    .done(function(html) { 
     $("#vr").html(html) 
     $(".value-charts").tablesorter(); 
}); 

有什么我可以这样做,当标签被重新点击它使用HTML在它之前进账至少直到用户刷新页面?如果缓存不存在,它只应该发出XHR请求。这是目前内置jQuery的,还是我必须编写自己的逻辑来工作?

+2

使用缓存:真不停止的情况发生的要求,它只是让浏览器缓存响应。如果您想阻止它再次发送请求,则必须手动执行此操作。 –

回答

1

如果你想避免发送请求,你必须自己做。

window.ajaxCache = {}; 

// later on: 
if (!window.ajaxCache["/nba/value_charts/" + site_id + "/" + t_date]) { 
    window.ajaxCache["/nba/value_charts/" + site_id + "/" + t_date] = $.get("/nba/value_charts/" + site_id + "/" + t_date); 
} 
window.ajaxCache["/nba/value_charts/" + site_id + "/" + t_date].done(function(html) { 
    $("#vr").html(html) 
    $(".value-charts").tablesorter(); 
}); 

所有cache: true确实是避免设置_参数以防止缓存,使浏览器缓存它就像它会的图像,假设服务器返回头告诉浏览器缓存它。

这是很容易抽象函数的背后:

getCachableData = (function(){ 
    var ajaxCache = {}; 
    return { 
     get: function(url) {} 
      if (!ajaxCache[url]) { 
       ajaxCache[url] = $.get(url); 
      } 
      return ajaxCache[url]; 
     }, 
     clear: function(url) { 
      if (url) { 
       ajaxCache[url] = false; 
      } 
      else { 
       ajaxCache = {}; 
      } 
     } 
    }; 
})(); 

// later on... 
getCachableData.get("/nba/value_charts/" + site_id + "/" + t_date).done(function(html){ 
    $("#vr").html(html) 
    $(".value-charts").tablesorter(); 
}); 
+0

哦,这看起来超级有趣。无论出于何种原因,在我已经访问过一个标签后,它仍然在进行XHR请求。 - 试图弄清楚上面的代码是什么导致它不仅仅从ajaxCache哈希中检索。 – randombits

+0

该版本更好吗? –

+0

etags可能是更好的替代方案。 –

0

什么是t_date

如果要附加一个时间戳的URL(这是什么cache: false一样),那么浏览器就会一直发出了新的要求,因为它认为所有的唯一网址/查询字符串参数作为唯一GET请求。

对您的请求的回复是否有cache-control标头?如果设置为no-cache,那么浏览器也会每次请求资源。

+0

't_date'只是我RESTF URL的一部分。它是'YYYYmmdd'格式的日期,而不是本身的时间戳。我不会为了缓存的目的而手动添加任何时间戳到URL,仅用于检索模型的特定状态。 – randombits