2012-01-30 170 views
16

我会尽我所能解释这一点。按下后退按钮时强制刷新/刷新

我有一个应用程序显示我的view页面中的50多个项目。用户可以单击单个项目并转至update页面以更新项目信息。一切工作正常,除了用户完成更新个人项目信息后,点击浏览器上的'返回'按钮到以前的view page。旧的项目信息(更新之前)仍然存在。用户必须点击刷新以查看更新的信息。这并不坏,但我希望提供更好的用户体验。任何想法解决这个问题?非常感谢。

回答

7

我认为你必须与JS的工作,使这项工作,因为没有办法让PHP能知道什么浏览器controlls用户访问...

也许这将帮助: http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript

+0

不再支持'onbeforeunload' ! – 2014-09-26 17:56:06

+0

@FranciscoCorralesMorales你在说[this](http://stackoverflow.com/questions/14645011/window-onbeforeunload-and-window-onunload-is-not-working-in-firefox-safari-o)? – Loupax 2014-10-07 08:35:27

1

那么,你可以在更新页面上提供一个内置的后退按钮,将它们发送给它(例如链接<a href="<?= $_SERVER['HTTP_REFERRER']; ?>">BACK</a>或在页面上放置一些脚本,这将强制它在每次页面时拉取数据无论是新的印象,还是使用后退按钮

+0

我的更新页面上有'返回主'按钮,但我无法确定用户不会在浏览器中点击后退按钮。另外,我在我的视图页面中有几个项目类型。我不能简单地添加脚本来强制页面刷新数据库中的数据,因为很难知道用户上次选择了什么类型的项目。 +1虽然。谢谢。 – FlyingCat 2012-01-30 23:30:18

-4

您可以在您的视图页面上发送HTTP标头,告诉浏览器页面不能被缓存,这意味着浏览器需要请求每次访问服务器的页面 - 这意味着它始终显示最新信息。

标题需要在任何其他内容之前发送,因此将以下权利放在顶部o在你的浏览页面。

header("Cache-Control: no-cache, must-revalidate"); 
+0

谢谢cb1。我试过了,但它仍然显示更新之前的信息。这是我放在视图页面的顶部。 <?php header(“Cache-Control:no-cache,must-revalidate”); ?> ... + 1虽然 – FlyingCat 2012-01-30 23:22:56

+0

这是一个奇怪的@Jerry - 这对我来说每次都有效。另外,放入'header(“Pragma:no-cache”);'在Cache-Control头下面 - 是的,放在视图页顶部是正确的。我认为你在重新测试之前清除了浏览器的缓存? – cb1 2012-01-30 23:36:52

+0

我没有清除缓存并尝试使用Firefox和Chrome。我还添加了第二个代码,但仍然无法工作。不过谢谢。 :( – FlyingCat 2012-01-31 00:11:06

1

这里是我的一些页面中使用的解决方案。将此添加到发生更改的页面。

window.onbeforeunload = function() { 
    window.name = "reloader"; 
     } 

这会在您离开这些页面时触发。如果有更改,您也可以触发它。这样它就不会不必要地重新加载需要重新加载的页面。 然后在你想在浏览器“返回”使用后重新加载的页面上。

if (window.name == "reloader") 
     { 
     window.name = "no"; 
     reloadPage(); 
     } 

这将触发你需要重新加载页面上重载... 希望这有助于:) 哦,顺便说一句,这是在JS。

+0

不幸的是,这在Firefox中不起作用(在v16.0.1中测试过) – Chris 2012-10-24 12:12:58

+0

Firefox(v16.0.1)你确定吗?我所有的旧代码仍然有效,但我实际上重新检查过。 – gekong 2012-10-25 02:28:17

+0

刚刚通过Chrome版本“30.0.1599.69米“,它似乎并没有工作。 – jfritz42 2013-10-23 19:43:20

17

“fb-cache”真的很烦人。这里有一个简单的javascript方法:

window.onpageshow = function(evt) { 
    // If persisted then it is in the page cache, force a reload of the page. 
    if (evt.persisted) { 
     document.body.style.display = "none"; 
     location.reload(); 
    } 
}; 

测试Safari 6和IE10。

+0

什么是铬? – 2014-02-16 22:57:29

+0

@ViniciusMiana我刚刚在铬36上测试它,它的工作原理。 – 2014-07-23 15:37:53

+0

实际上这是有效的,但是在iOs中它只能工作一次,如果你尝试点击前进回退,你会注意到这个事件只会触发一次。 – Rantiev 2014-09-03 13:35:18

-1

我使用jQuery和php脚本强制重新加载回退。 window.unload部分只在Firefox中需要。超时1秒和正文附加部分仅用于说明功能。 window.location.reload(true)将给出与window.location.href = window.location.href;

的jQuery:

<script> 
    $(window).unload(function() {}); 


     $.get('h.php',function(data){ 
      if($.trim(data)=='first'){ 
       // $('body').append(data) 
       // setTimeout(function(){ 
       window.location.href = window.location.href; 
       // },1000) 
      } 
      else { 
       // $('body').append(data) 
      } 
     }); 

</script> 

小时。PHP:

<?php session_start(); ?> 
<?php 
if(!$_SESSION['reloaded']){ 
    echo 'first'; 

    $_SESSION['reloaded']=1; 
} 
else { 
    echo 'second'; 
    unset($_SESSION['reloaded']); 
} 
?> 
0

使隐藏复选框,并使用下面的代码(CoffeeScript的)

window.location.reload() if $("#refreshCheck")[0].checked 
    $("#refreshCheck")[0].checked = true 
1
if (window.name == "reloader") { 
      window.name = ""; 
      location.reload(); 
     } 

window.onbeforeunload = function() { 
       window.name = "reloader"; 
      } 

在我使用的PHP代码,这四行每一个页面

16

添加这两种功能:

// any valid date in the past 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
// always modified right now 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
// HTTP/1.1 
header("Cache-Control: private, no-store, max-age=0, no-cache, must-revalidate, post-check=0, pre-check=0"); 
// HTTP/1.0 
header("Pragma: no-cache"); 

关键是使用Cache-Control头的“no-store”子句。

+1

这对我有用。我认为使用浏览器(通过PHP)是最安全的选择,尤其是在JavaScript被关闭的情况下。 – 2014-11-19 01:39:55

+0

这对我而言并不适用于Safari 9,但它确实适用于Chrome – tam5 2016-03-06 22:55:25

1

这是我使用的解决方案:

<?php 
session_start(); 
if (!$_SESSION['reloaded']) {$_SESSION['reloaded'] = time();} 
else if ($_SESSION['reloaded'] && $_SESSION['reloaded'] == time()) { ?> 
<script> 
location.reload(); 
</script> 
<?php } ?> 
1

上述解决方案都没有为我工作。 发布here这种简单的解决方案工作...

我试过,当用户单击后退按钮来强迫页面被浏览器再次下载,但没有奏效。我发现现代浏览器对页面有单独的缓存,它存储页面的完整状态(包括JavaScript生成的DOM元素),所以当用户按下后退按钮时,前一页会立即显示为用户离开它的状态。如果要强制浏览器重新加载上后退按钮页面,onunload的添加=“”你的(X)HTML body元素:

<body onunload="">

这将禁用特定的缓存,并强制页面重新加载时用户按下 后退按钮。在使用前请仔细考虑。需要这样的 解决方案的事实是一个暗示你的网站导航概念是有缺陷的。

+1

完美。尝试了10多种解决方案,但比这帮助了我。 – Shwet 2015-10-26 12:38:45

2

幸运的是,我们没有支持以下IE10浏览器,所以如果你愿意还是足够特权只支持HTML5是功能的浏览器,下面应该工作:

/* 
* The following is intentional, to force Firefox to run 
* this JS snippet after a history invoked back/forward navigation. 
*/ 
window.onunload = function(){};  

function formatTime(t) { 
    return t.getHours() + ':' + t.getMinutes() + ':' + t.getSeconds(); 
} 

if (window.history.state != null && window.history.state.hasOwnProperty('historic')) { 
    if (window.history.state.historic == true) { 
     document.body.style.display = 'none'; 
     console.log('I was here before at ' + formatTime(window.history.state.last_visit)); 
     window.history.replaceState({historic: false}, ''); 
     window.location.reload(); 
    } else { 
     console.log('I was forced to reload, but WELCOME BACK!'); 
     window.history.replaceState({ 
      historic : true, 
      last_visit: new Date() 
     }, ''); 
    } 
} else { 
    console.log('This is my first visit to ' + window.location.pathname); 
    window.history.replaceState({ 
     historic : true, 
     last_visit: new Date() 
    }, ''); 
} 

好,这里是没有的意见和松弛代码:

window.onunload = function(){}; 

if (window.history.state != null && window.history.state.hasOwnProperty('historic')) { 
    if (window.history.state.historic == true) { 
     document.body.style.display = 'none'; 
     window.history.replaceState({historic: false}, ''); 
     window.location.reload(); 
    } else { 
     window.history.replaceState({historic : true}, ''); 
    } 
} else { 
    window.history.replaceState({historic : true}, ''); 
} 

棒,只是你的结束标记之前,你就会有一个相当干净的解决方案。

这将适用于单击后退/前进的任意组合,当用户登录新页面时,不会强制重新加载。

了解更多关于MDN的历史对象:

MDN - The History Object

MDN - Manupulating the Browser History

+0

你介意添加标签?所以即使对于经验较少的人也可以实施。 – RaRdEvA 2017-05-05 20:23:24

0

搜索在网络上找到一个解决办法的天后,我终于弄明白,添加后:

<script> 
window.onbeforeunload = function(){window.location.reload();} 
</script> 

这会像魅力一样工作 你会感谢我

此代码将在您访问它时重新加载页面。