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

Javascript 强制Firefox在后退按钮上重新加载页面,javascript,html,firefox,caching,Javascript,Html,Firefox,Caching,当用户按下后退按钮时,如何让Firefox重新运行javascript并重新加载整个页面?通过添加以下代码,我可以在除Firefox之外的所有浏览器中完成这项工作,这得益于另一个SO问题: history.navigationMode = 'compatible'; $("body").unload(function(){}) 还添加了一个iFrame。。。但这在Firefox中不起作用。有什么事要做吗?在你的头标签之间加上这个 <META HTTP-EQUIV="Pragma" CON

当用户按下后退按钮时,如何让Firefox重新运行javascript并重新加载整个页面?通过添加以下代码,我可以在除Firefox之外的所有浏览器中完成这项工作,这得益于另一个SO问题:

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

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

在你的头标签之间加上这个

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

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


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

所有这些对我都不起作用。我通过cookies检查来实现这一点——我在页面的头部导入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>

var REFRESH\u PAGE\u COOKIE\u NAME=“refreshPage”;
var PAGE_REFRESH_GUID=“”;
/*要在用户或javascript单击“后退”时强制刷新页面,
*在body onload函数中调用此方法-而不是通过JQUERY
*因为jqueryonload不会在历史记录返回时调用。
*在中,必须通过
*/
函数refreshOnBack(){
//Alghoritm使用cookies检查页面是否已加载。
//未设置Cookie过期时间-将在浏览器重新启动后消失。
//Alghoritm:
//饼干做好了吗?
//-是-重新加载;
//-否-设置它;
//Cookie在名称中包含唯一的guid,因此当重新生成页面时,它将不会重新加载。
var cookieName=刷新页面COOKIE名称+页面刷新GUID;
如果(getCookie(cookieName)=“Y”){
window.location.reload();
}否则{
setCookie(cookieName,“Y”);
}
}   

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

我为Firefox和Google Chrome做了一个变通方案。它们有不同的行为来显示缓存的页面

这样做将阻止Firefox缓存页面,而“后退”按钮将从服务器中取出页面

window.onunload = function(){};
但是谷歌Chrome用另一种方式来做,上面的解决方案对我来说不起作用。所以我为Chrome做了另一个解决方案。我做了一个标志,标志着形式肮脏

的顶部,在加载任何内容之前,我检查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;
  })
})
很高兴知道:


    • 我想你可能想要的答案是:

      TLDR:HTTPS+
      缓存控制:必须重新验证
      ,因为服务器发送的头+
      过期
      过去设置的头应该可以工作。下面是一个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,您可以通过编程方式在页面加载或初始化事件中处理它

      Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
      Response.Cache.SetCacheability(HttpCacheability.Public);
      Response.Cache.SetValidUntilExpires(false);
      Response.Cache.VaryByParams["*"] = true;
      
      有关详细信息,请查看MSDN上的Response.Cache:

      这个解决方案对我很有效(我认为比其他建议的解决方案简单一些):


      如果浏览器是FireFox,我会在每次加载页面时调用此代码。(要了解当前运行的浏览器是否为Firefox,请参阅)。

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

      <?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中添加标题,请阅读以下内容


      注意:此解决方案不起作用。至少在最近的Chrome和Firefox中没有。至于为什么它不起作用:如何调用refreshOnBack?window.onunload=function(){}与Angular一起为我工作。在前面的回答中添加元标记没有。很抱歉,这是一个循环。这个主意是什么?
      <?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");
      ?>