【问题标题】:Force Firefox to Reload Page on Back Button强制 Firefox 在返回按钮上重新加载页面
【发布时间】:2011-04-01 23:56:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript html firefox caching


    【解决方案1】:

    在你的 HEAD 标签之间添加这个

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

    【讨论】:

    【解决方案2】:

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

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

    这样做会阻止 Firefox 缓存页面,并且返回按钮会将页面从服务器中取出。

    window.onunload = function(){};
    

    但谷歌浏览器以另一种方式做到这一点,上面的解决方案对我不起作用。所以我为 Chrome 做了另一个解决方法。我做了一个标记,将表单标记为脏。

    &lt;head&gt;的顶部,在加载任何东西之前,我检查了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.onunload=function() {} 与 Angular 一起为我工作。没有像上一个答案那样添加元标记。
    【解决方案3】:

    这个解决方案对我有用(我相信比其他建议的解决方案简单一些):

        $(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)。

    【讨论】:

    • 对不起,这是一个循环。想法是什么?
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 如何调用 refreshOnBack?
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          如果您使用 c# .Net,您可以在页面加载或初始化事件中以编程方式处理它

          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

          【讨论】:

            猜你喜欢
            • 2015-04-04
            • 2012-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多