AJAX-based 导航和浏览器还原
AJAX-based navigation and Browser restore
我在 Rails 网站的一部分中使用 AJAX-based 导航,使用两个基本的 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);
});
导航工作正常,我可以使用浏览器的 back/forward 按钮,并刷新页面,在这种情况下,该操作不会执行 JS 脚本,而是呈现相应的完整 HTML查看。
但是,当我使用 AJAX 导航到页面时(因此通过执行脚本加载部分内容),关闭浏览器,然后重新打开它并选择 "restore tabs" 选项,页面显示脚本代码(但呈现 ERB 位)而不是执行它。我猜这是因为浏览器在请求时缓存的是服务器响应,正是那个脚本。
所以我的问题是,有没有办法操纵浏览器缓存以强制它重新加载页面,例如在呈现 JS 时将响应 headers 设置为 no-cache 值格式要求?这会导致浏览器重新加载页面并因此退回到 HTML 渲染(这完全没问题)吗?
谢谢!
通过将以下内容添加到我的根应用程序控制器 (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,那么 headers 被操纵到 'bust' 缓存,阻止浏览器缓存 javascript 响应,从而强制重新加载页面基于 URL,可以正确呈现文档。
我在 Rails 网站的一部分中使用 AJAX-based 导航,使用两个基本的 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);
});
导航工作正常,我可以使用浏览器的 back/forward 按钮,并刷新页面,在这种情况下,该操作不会执行 JS 脚本,而是呈现相应的完整 HTML查看。
但是,当我使用 AJAX 导航到页面时(因此通过执行脚本加载部分内容),关闭浏览器,然后重新打开它并选择 "restore tabs" 选项,页面显示脚本代码(但呈现 ERB 位)而不是执行它。我猜这是因为浏览器在请求时缓存的是服务器响应,正是那个脚本。
所以我的问题是,有没有办法操纵浏览器缓存以强制它重新加载页面,例如在呈现 JS 时将响应 headers 设置为 no-cache 值格式要求?这会导致浏览器重新加载页面并因此退回到 HTML 渲染(这完全没问题)吗?
谢谢!
通过将以下内容添加到我的根应用程序控制器 (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,那么 headers 被操纵到 'bust' 缓存,阻止浏览器缓存 javascript 响应,从而强制重新加载页面基于 URL,可以正确呈现文档。