2012-01-30 172 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> 

這會像魅力一樣工作 你會感謝我

此代碼將在您訪問它時重新加載頁面。