2014-01-16 118 views
2

我已經編寫了一些自定義導航按鈕到我正在通過javascript工作的項目 - 他們基本上覆制瀏覽器按鈕功能(最初並不清楚爲什麼單獨的按鈕是必需的,但他們要求他們):使用自定義javascript後退按鈕時刪除POST數據

function goBack() { window.history.back(); } 
function goForward() { window.history.forward(); } 

然而,由於功能是一樣的瀏覽器後退按鈕,網站問我是否要重新提交POST數據,如果我回去一個頁面,說: POST數據,這是不可取的。理想情況下,爲了適應當前的站點設置(所有POST提交到始發頁面,檢查POST數據並執行相關提交到數據庫),我想清除POST數據,因此沒有請求重新提交。

我對人們可能會推薦的Post/Redirect/Get(PRG)並不熟悉,似乎也沒有涵蓋持續按下「返回」的概念。如果您提交表單,則發佈到處理髮布操作的頁面,然後重定向到GET頁面 - 但重定向仍在歷史記錄中,這意味着如果您返回,那麼您肯定會點擊重定向頁面併發送「前鋒」?此外,PRG似乎主要集中在頁面刷新上,這不是我目前正在尋找的內容。

PRG的概念似乎也是由於瀏覽器後退按鈕不允許額外的代碼來控制POST數據,因此編碼人員必須儘可能地利用他們可以訪問的內容。

隨着我有一個自定義後退按鈕可以允許操縱POST/session/cookie數據的相對自由度,我認爲應該有一些方法在後退按鈕按下時調用全局會話變量或cookie,然後在前一頁加載中取消以取消設置POST數據和全局會話變量/ cookie,但是我嘗試實現類似這樣的操作沒有成功 - 它們是簡單的單行setcookie('back', true)set($_SESSION['back']=true) PHP片段,在goBack()之內,與在頁面前面的PHP:

<?php if (isset([either set cookie or set session variable]) { 
    unset([either set cookie or set session variable]); // also tried changing 'true' to 'false' here 
    unset($_POST); 
}?> 

這種行爲是可能的,我只是看着這個從t他錯誤的角度,還是唯一的方法來做一個成功的回擊行動,同時壓制POST重新設計該網站使用PRG,這將是相當重要的legwork?頁面加載/ POST提交中是否還有其他一些要點可以清除POST數據,以允許我正在查找的後退按鈕功能?

編輯

我,作爲一個例子,導航到site.com/stuff/edit/[an ID],編輯的東西的項目。我第一次訪問時,沒有POST數據,因此isset($ _ POST)的PHP檢查返回false,並且頁面只是用GET填充的表單呈現。

我在表單中修改並按提交。提交將POST數據發送到目標頁面;這仍然是site.com/stuff/edit/[an ID]!但是,由於現在有POST數據,PHP會選擇它並在頁面上驗證它(稍後會看到爲什麼),並執行後端模型和控制器函數以將項目更新到爲該站點提供服務的數據庫。

根據更新是否成功,頁面然後再次呈現形式,與拉從服務器(修訂或以其他方式)的信息是從一個GET檢索到的信息,無論是成功的還是失敗的消息。

如果我想添加一個新項目,我導航到site.com/stuff/new;這導航到與site.com/stuff/edit相同的頁面,但PHP代碼確定屏蔽URL並將代碼的不同方面呈現爲具有不同POST操作的不同頁面 - 它還指出沒有傳入ID。

I添加一個項目,並且POST重定向回到同一頁面;但是這一次,服務器沒有Id,這意味着後面的代碼會提取它是新條目的事實,並執行插入操作。然後,它會顯示帶有鏈接的成功消息,以查看/編輯新項目,或者顯示帶有預填表單的失敗消息,以減少將新項目重新輸入到表單中。

我希望這有助於顯示此頁面的工作原理;它不一定是我寫這個網站的方式,但我從一個持續的情況繼承了這項工作,並與其他以這種方式進行編碼的人一起工作,所以我需要保持一致或者做出不顯眼的改變,而不是根本性地重新設計使用中的碼。

+0

我懷疑回去2頁會解決你的問題,但也許我沒有得到你到底想要什麼。 –

+0

問題的主要焦點是代碼是否可以放在goBack()中,當通過javascript的window.history.back()導航回去時,可以刪除/取消設置POST數據。 該按鈕出現在所有頁面上;會不會有一種方法來確定是否有POST數據,如果存在則返回兩頁?不確定是否提供了所需的功能,但如果可能的話願意嘗試。 –

回答

0

我想這應該做的工作:

function goBack() { 
    var referrer = document.referrer; 
    if(referrer != '') { 
     window.location = referrer; 
    } else { 
     window.history.back(); 
    } 
} 
+0

不幸的是,這段代碼將先前查看的頁面設置爲要返回的頁面;從「頁面1」 - >「頁面2」 - >「頁面3」 - >「頁面4」導航,然後向後按壓三次,然後進入4-> 3-> 4-> 3,而不是4-> 3-> 2 - > 1。我想,通過歷史堆棧進行導航是必要的。它更多的是以某種方式剝離POST數據,或者省略隨後按鈕被按下時頁面執行的POST。 –

+0

不幸的是,我不知道一種方法來獲取「history.go(-1)」的網址。 我認爲這是不允許的隱私原因 –

+0

順便說一句,爲什麼你不重新加載着陸頁? –