繁体   English   中英

强制Firefox在后退按钮上重新加载页面

[英]Force Firefox to Reload Page on Back Button

当用户按下后退按钮时,如何让Firefox重新运行javascript并重新加载整个页面? 通过添加此代码,我可以在除了Firefox之外的所有浏览器中通过另一个SO问题的帮助来执行此操作:

history.navigationMode = 'compatible';
$("body").unload(function(){})

并且还添加了iFrame ...但这在Firefox中不起作用。 有什么事可做吗?

在HEAD标签之间添加此项

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">

在我的情况下,在最终用户将他的新数据发布到服务器之后,他被重定向到另一个页面。 但是当最终用户按下后退按钮时,表单会预先填充旧数据。 因此,需要重新加载页面。

我为Firefox做了一个解决方法,为谷歌Chrome做了另一个解决方法。 它们具有显示缓存页面的不同行为。

这样做会阻止Firefox缓存页面,后退按钮会阻止来自服务器的页面。

window.onunload = function(){};

但谷歌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;
  })
})

很高兴知道:

这个解决方案对我有用(我相信比其他解决方案更简单):

    $(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,请参阅此处 )。

作为参考,该navigationMode属性仅适用于Opera,只是IE和Webkit浏览器已经具有提问者想要的行为。

IE和Webkit做Opera所谓的“兼容”导航。 Firefox做了Opera所谓的“快速”导航。 但只有在Opera中,这种行为实际上是可控制的。

这些都不适合我。 我是通过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>

我想你可能想要的答案就在这里: 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>

如果您使用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

将此添加到您的文件。 在测试之前先清理缓存。

<?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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM