我會盡我所能解釋這一點。按下後退按鈕時強制刷新/刷新
我有一個應用程序顯示我的view
頁面中的50多個項目。用戶可以單擊單個項目並轉至update
頁面以更新項目信息。一切工作正常,除了用戶完成更新個人項目信息後,點擊瀏覽器上的'返回'按鈕到以前的view page
。舊的項目信息(更新之前)仍然存在。用戶必須點擊刷新以查看更新的信息。這並不壞,但我希望提供更好的用戶體驗。任何想法解決這個問題?非常感謝。
我會盡我所能解釋這一點。按下後退按鈕時強制刷新/刷新
我有一個應用程序顯示我的view
頁面中的50多個項目。用戶可以單擊單個項目並轉至update
頁面以更新項目信息。一切工作正常,除了用戶完成更新個人項目信息後,點擊瀏覽器上的'返回'按鈕到以前的view page
。舊的項目信息(更新之前)仍然存在。用戶必須點擊刷新以查看更新的信息。這並不壞,但我希望提供更好的用戶體驗。任何想法解決這個問題?非常感謝。
我認爲你必須與JS的工作,使這項工作,因爲沒有辦法讓PHP能知道什麼瀏覽器controlls用戶訪問...
也許這將幫助: http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
那麼,你可以在更新頁面上提供一個內置的後退按鈕,將它們發送給它(例如鏈接<a href="<?= $_SERVER['HTTP_REFERRER']; ?>">BACK</a>
或在頁面上放置一些腳本,這將強制它在每次頁面時拉取數據無論是新的印象,還是使用後退按鈕
我的更新頁面上有'返回主'按鈕,但我無法確定用戶不會在瀏覽器中點擊後退按鈕。另外,我在我的視圖頁面中有幾個項目類型。我不能簡單地添加腳本來強制頁面刷新數據庫中的數據,因爲很難知道用戶上次選擇了什麼類型的項目。 +1雖然。謝謝。 – FlyingCat 2012-01-30 23:30:18
您可以在您的視圖頁面上發送HTTP標頭,告訴瀏覽器頁面不能被緩存,這意味着瀏覽器需要請求每次訪問服務器的頁面 - 這意味着它始終顯示最新信息。
標題需要在任何其他內容之前發送,因此將以下權利放在頂部o在你的瀏覽頁面。
header("Cache-Control: no-cache, must-revalidate");
謝謝cb1。我試過了,但它仍然顯示更新之前的信息。這是我放在視圖頁面的頂部。 <?php header(「Cache-Control:no-cache,must-revalidate」); ?> ... + 1雖然 – FlyingCat 2012-01-30 23:22:56
這是一個奇怪的@Jerry - 這對我來說每次都有效。另外,放入'header(「Pragma:no-cache」);'在Cache-Control頭下面 - 是的,放在視圖頁頂部是正確的。我認爲你在重新測試之前清除了瀏覽器的緩存? – cb1 2012-01-30 23:36:52
我沒有清除緩存並嘗試使用Firefox和Chrome。我還添加了第二個代碼,但仍然無法工作。不過謝謝。 :( – FlyingCat 2012-01-31 00:11:06
這裏是我的一些頁面中使用的解決方案。將此添加到發生更改的頁面。
window.onbeforeunload = function() {
window.name = "reloader";
}
這會在您離開這些頁面時觸發。如果有更改,您也可以觸發它。這樣它就不會不必要地重新加載需要重新加載的頁面。 然後在你想在瀏覽器「返回」使用後重新加載的頁面上。
if (window.name == "reloader")
{
window.name = "no";
reloadPage();
}
這將觸發你需要重新加載頁面上重載... 希望這有助於:) 哦,順便說一句,這是在JS。
「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。
什麼是鉻? – 2014-02-16 22:57:29
@ViniciusMiana我剛剛在鉻36上測試它,它的工作原理。 – 2014-07-23 15:37:53
實際上這是有效的,但是在iOs中它只能工作一次,如果你嘗試點擊前進回退,你會注意到這個事件只會觸發一次。 – Rantiev 2014-09-03 13:35:18
我使用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']);
}
?>
使隱藏複選框,並使用下面的代碼(CoffeeScript的)
window.location.reload() if $("#refreshCheck")[0].checked
$("#refreshCheck")[0].checked = true
if (window.name == "reloader") {
window.name = "";
location.reload();
}
window.onbeforeunload = function() {
window.name = "reloader";
}
在我使用的PHP代碼,這四行每一個頁面
添加這兩種功能:
// 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」子句。
這對我有用。我認爲使用瀏覽器(通過PHP)是最安全的選擇,尤其是在JavaScript被關閉的情況下。 – 2014-11-19 01:39:55
這對我而言並不適用於Safari 9,但它確實適用於Chrome – tam5 2016-03-06 22:55:25
這是我使用的解決方案:
<?php
session_start();
if (!$_SESSION['reloaded']) {$_SESSION['reloaded'] = time();}
else if ($_SESSION['reloaded'] && $_SESSION['reloaded'] == time()) { ?>
<script>
location.reload();
</script>
<?php } ?>
上述解決方案都沒有爲我工作。 發佈here這種簡單的解決方案工作...
我試過,當用戶單擊後退按鈕來強迫頁面被瀏覽器再次下載,但沒有奏效。我發現現代瀏覽器對頁面有單獨的緩存,它存儲頁面的完整狀態(包括JavaScript生成的DOM元素),所以當用戶按下後退按鈕時,前一頁會立即顯示爲用戶離開它的狀態。如果要強制瀏覽器重新加載上後退按鈕頁面,onunload的添加=「」你的(X)HTML body元素:
<body onunload="">
這將禁用特定的緩存,並強制頁面重新加載時用戶按下 後退按鈕。在使用前請仔細考慮。需要這樣的 解決方案的事實是一個暗示你的網站導航概念是有缺陷的。
完美。嘗試了10多種解決方案,但比這幫助了我。 – Shwet 2015-10-26 12:38:45
幸運的是,我們沒有支持以下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的歷史對象:
你介意添加標籤?所以即使對於經驗較少的人也可以實施。 – RaRdEvA 2017-05-05 20:23:24
搜索在網絡上找到一個解決辦法的天后,我終於弄明白,添加後:
<script>
window.onbeforeunload = function(){window.location.reload();}
</script>
這會像魅力一樣工作 你會感謝我
此代碼將在您訪問它時重新加載頁面。
不再支持'onbeforeunload' ! – 2014-09-26 17:56:06
@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