当用户按下后退按钮时,如何让Firefox重新运行javascript并重新加载整个页面?通过添加此代码,我可以在除Firefox之外的所有浏览器中执行此操作:
history.navigationMode = 'compatible';
$("body").unload(function(){})
并且还添加了iFrame ...但这在Firefox中不起作用。有什么可做的吗?
答案 0 :(得分:9)
在HEAD代码之间添加
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
答案 1 :(得分:8)
就我而言,在最终用户将新数据发布到服务器后,他被重定向到另一个页面。但是当最终用户按下后退按钮时,表单会预先填充旧数据。因此,需要重新加载页面。
我为Firefox做了一个解决方法,为谷歌Chrome做了另一个解决方法。它们具有显示缓存页面的不同行为。
执行此操作将阻止Firefox缓存页面,后退按钮将阻止来自服务器的页面。
window.onunload = function(){};
但Google Chrome以另一种方式执行此操作,上述解决方案对我无效。所以我为Chrome做了另一个解决方法。我做了一个标志,将表格标记为脏。
在<head>
的顶部,在加载任何内容之前,我会检查cookie
if(document.cookie.match(/my-form=dirty/)) {
document.cookie = "my-form=; expires=-1; path="+document.location.pathname;
window.location.reload();
}
在jQuery的帮助下,我在用户修改内容时编写了cookie
$(document).load(function(){
$(':input').change(function(){
document.cookie = "my-form=dirty; expires=86400000; path="+document.location.pathname;
})
})
很高兴知道:
答案 2 :(得分:4)
这个解决方案对我有用(我相信比其他解决方案更简单):
$(window).bind('pageshow', function() {
// This event is called only by FireFox. Because Firefox doesn't reload the page when the user uses the back button,
// or when we call history.go.back(), we need to force the reload for the applicatino to work similar to Chrome and IE (11 at least).
// Doc: https://developer.mozilla.org/en-US/docs/Listening_to_events_in_Firefox_extensions
location.reload();
});
如果浏览器是FireFox,我会在每个页面加载时调用此代码。 (要了解当前运行的浏览器是否为Firefox,请参阅here)。
答案 3 :(得分:3)
作为参考,该navigationMode属性仅适用于Opera,只是IE和Webkit浏览器已经具有提问者想要的行为。
IE和Webkit做Opera所谓的“兼容”导航。 Firefox做了Opera所谓的“快速”导航。但只有在Opera中,这种行为实际上是可控制的。
答案 4 :(得分:0)
这些都不适合我。我通过cookie检查来做 - 我在页面的头部导入jsp(源代码如下),然后我调用了refreshOnBack。
<%@ page import="java.util.UUID" %>
<script>
var REFRESH_PAGE_COOKIE_NAME="refreshPage_";
var PAGE_REFRESH_GUID = "<%out.print(UUID.randomUUID().toString());%>";
/* To force refresh of page when user or javascript clicks "back",
* put call to this method in body onload function - NOT THROUGH JQUERY
* as jquery onload is not called on history back.
* In must be done via <BODY onload="...">
*/
function refreshOnBack(){
//Alghoritm uses cookies to check if page was already loaded.
//Cookies expiration time is not set - will be gone after browser restart.
//Alghoritm:
//is cookie set?
// -YES - reload;
// -NO - set it up;
//Cookie contains unique guid in name so that when page is regenerated - it will not reload.
var cookieName = REFRESH_PAGE_COOKIE_NAME + PAGE_REFRESH_GUID;
if(getCookie(cookieName)=="Y"){
window.location.reload();
} else {
setCookie(cookieName,"Y");
}
}
</script>
答案 5 :(得分:0)
我认为你可能想要的答案就在这里:https://stackoverflow.com/a/5493543/1475148
TLDR:HTTPS + Cache-Control: must-revalidate
作为服务器发送的标头+ Expires
标头在过去设置应该可以正常工作。这是PHP实现的示例:
<?php
$expires = gmdate( 'D, d M Y H:i:s', time() - 1 );
header( 'Cache-Control: must-revalidate' );
header( "Expires: {$expires} GMT" );
?>
<!DOCTYPE html>
<html>
<head>
<title>Auto-reloading page</title>
</head>
<body>
<p>The current day is <?php echo date( 'd, F Y'); ?> and the time is <?php echo date('H:i:s'); ?>.</p>
<p><a href="http://google.com">Click away</a></p>
</body>
</html>
答案 6 :(得分:0)
如果你使用c#.Net,你可以通过编程方式在页面加载或init事件上处理它
Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["*"] = true;
有关详细信息,请查看MSDN上的Response.Cache: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.cache(v=vs.110).aspx
答案 7 :(得分:0)
将此添加到您的文件。在测试之前先清理缓存。
<?php
header("Cache-Control: private, no-store, max-age=0, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
?>
要在javascript中添加标题,请阅读此内容。
https://developer.mozilla.org/en-US/docs/Web/API/Headers/append