Javascript:访问前一个状态时再次发出请求

Javascript:访问前一个状态时再次发出请求,javascript,ruby-on-rails,Javascript,Ruby On Rails,我在JS中使用这个: window.history.replaceState({url: , scrollTop: wTop}, 'foo', 'bar'); 但是当我从这里转到另一个页面,然后按下后退按钮时,我最终没有发出请求。相反,我的浏览器从“磁盘缓存”加载所有内容。我想再次触发请求,因为我的状态已更改,它应该请求更正的页面。 我怎样才能做到这一点 我在rails控制器中尝试过: response.headers['Cache-Control'] = 'no-cache, no-stor

我在JS中使用这个:

window.history.replaceState({url: , scrollTop: wTop}, 'foo', 'bar');
但是当我从这里转到另一个页面,然后按下后退按钮时,我最终没有发出请求。相反,我的浏览器从“磁盘缓存”加载所有内容。我想再次触发请求,因为我的状态已更改,它应该请求更正的页面。 我怎样才能做到这一点

我在rails控制器中尝试过:

response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
response.headers['Pragma'] = 'no-cache'
response.headers['Expires'] = '0'

但显然,历史记录列表与缓存功能并不完全相关。

我会使用隐藏输入和一点脚本来完成它。假设您有可用的jQuery(显然,如果不使用它,只需修改它):

location.reload事件中的“true”标志告诉它从服务器而不是从缓存重新加载页面。浏览器应该将您的输入值存储为缓存的一部分,这样当您返回页面时,页面将刷新,而不是在第一次加载页面时

如果您使用的是已添加的页面,因此该页面没有历史状态,则可以稍微反转该过程,而不是直接重新加载,如上所述,添加要提交的表单,而不是直接重新加载,如下所示:

<form id="reload_form" method="get">
<input type="hidden" id="no_refresh" val="true" />
</form>
这使用了找到的$.urlParam函数,但工作原理与上面代码段中的自然“back”函数类似——一旦提交表单以刷新页面,参数就变为可用,并且更改的状态阻止脚本刷新页面。

您需要添加一个

如果不添加此侦听器,则浏览器将以传统方式运行,在状态更改时从服务器请求页面(或从缓存加载)


注意:浏览器缓存标头仍可以与推/弹出状态一起使用,以提高首页加载。

是否使用TurboLink?您发布的Javascript是否嵌入到文档正文中?不,我不使用TurboLink。但是JS确实嵌入到了body中。嗯,更正:我的JS被预编译到了一个文件中,该文件位于文档头中,因此不,它不在body in fact.JS definal guide中当用户使用后退或前进按钮导航到保存的历史状态时,浏览器会在窗口对象上触发popstate事件。与事件关联的事件对象具有名为state的属性,该属性包含传递给pushState()的state对象的副本。我猜这正是您在浏览历史记录时可能返回的状态。您可能可以通过使用location.reload.method()钩住popstate事件来更改逻辑例如重新加载页面。只是一些想法。
$(document).ready(function() {
   if ($("#reload_page").val() == "true") {
       location.reload(true);
   } else {
       $("#reload_page").val("true");
   }
}
<form id="reload_form" method="get">
<input type="hidden" id="no_refresh" val="true" />
</form>
$(document).ready(function() {
    if (!$.urlParam('no_refresh')) {
        $("#reload_form").submit();
    }
});
window.onpopstate = function(event) {
   alert("location: " + document.location + ", state: " + JSON.stringify(event.state));
};