我在Rails网站的一个部分中使用基于AJAX的导航,使用两个基本的jQuery钩子,在Coffescript中表示:
$(document).on 'click', 'a.ajax_nav', (e) ->
window.history.pushState(null, "page title", this.href)
$(window).on 'popstate', (e) ->
$.getScript(document.location)
或等效的Javascript:
$(document).on('click', 'a.ajax_nav', function(e) {
return window.history.pushState(null, "page title", this.href);
});
$(window).on('popstate', function(e) {
return $.getScript(document.location);
});
导航工作正常,我可以使用浏览器的后退/前进按钮,并进行页面刷新,在这种情况下,操作不会执行JS脚本,而是呈现相应的完整HTML视图。
但是,当我使用AJAX导航到页面时(因此通过执行脚本加载部分内容),关闭浏览器,然后重新打开它并选择“恢复选项卡”选项,页面显示脚本代码(但是ERB位被渲染)而不是执行它。我猜这是因为浏览器在请求时缓存的是服务器响应,这是该脚本的确切。
所以我的问题是,是否有办法操纵浏览器缓存以强制它重新加载页面,例如在呈现JS格式请求时将响应标头设置为无缓存值?这会导致浏览器重新加载页面,从而回退到HTML渲染(这将是完美的)?
谢谢!
答案 0 :(得分:0)
通过将以下内容添加到我的根应用程序控制器(application_controller.rb)来解决此问题:
class ApplicationController < ActionController::Base
.
.
before_filter :set_cache_for_js
.
.
protected
def set_cache_for_js
set_cache_buster if request.format == 'text/javascript' # probably a better way to do this
end
def set_cache_buster
response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
end
.
.
end
这样,在整个应用程序的每个操作之前调用set_cache_for_js
过滤器。如果请求的格式是javascript,那么标题会被操纵为“破坏”#39;缓存,防止浏览器缓存javascript响应,从而强制基于URL重新加载页面,从而正确地呈现文档。