2012-12-12 133 views
5

我有一個表單。成功提交後,會有一個服務器端重定向來查看新條目。單擊後退按鈕後防止重新填充表單域

問題:所有的投入仍與過去的值填充按下後退按鈕後(它不會自動重新提交表單或顯示「確認提交表單」的提示)。這允許用戶再次手動單擊「提交」並非常容易地提交重複條目,這是我想要避免的。請注意,這不是經典的「轉貼」問題,我們使用的是後/重定向/獲取模式。

表單中有20多個字段,從技術上講它是可能兩個相同的條目可能是合法的,但我只希望在用戶按下後退按鈕時清除這些字段。

這是我已經試過:

無緩存頭無緩存的
header('Cache-Control: must-revalidate, no-store, no-cache, private, max-age=0'); 
header('Pragma: no-cache'); 
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); 
組合meta標籤
<meta http-equiv="cache-control" content="max-age=0" /> 
<meta http-equiv="cache-control" content="no-cache" /> 
<meta http-equiv="expires" content="0" /> 
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" /> 
<meta http-equiv="pragma" content="no-cache" /> 
提交使用JavaScript重定向
$('form').submit(function(){ 
    $.post($(this).attr('action'), $(this).serialize(), function(response){ 
     window.location = response.redirectUrl; 
    }); 
}); 
「刷新」提交表單
header('refresh:0; url=view_entry'); 
刷新由會話數據觸發後重定向(開始有點哈克在這裏...)
// psuedo PHP code for the "add" page 
if ($_SESSION['submit']) { 
    $_SESSION['submit'] = 0; 
    redirect(current_url); // Cross fingers and hope this clears the form 
} 
if ($formValid and $saveEntry) { 
    $_SESSION['submit'] = 1; 
    redirect(next_url); 
} 

無的這個作品中,字段仍然填充後擊中後退按鈕。最後一個選項實際上觸發了「確認表單提交」提示,這不是我想要的,但至少它會好一點。

我要指出,這是谷歌瀏覽器。 Codeigniter和jQuery可用,如果有幫助。我只是希望在用戶點擊後退按鈕後清除表單域,並在發佈成功的條目之後清除。我實際上並沒有回憶過這個問題,我完全沒有想法。什麼是正確的方法來做到這一點?

+0

FWIW我已經嘗試啓用Codeigniter的CSRF保護,但隨機數得到重新生成在後退按鈕,所以它沒有幫助... –

+1

如何在谷歌瀏覽器重新生成一個CSRF令牌但不清除表單值?! – stormdrain

+0

或者*爲什麼瀏覽器在發佈/重定向後保持字段值? –

回答

2

的便捷的方法是在響應和重定向之前單獨後清除農田。

$('form').submit(function(){ 
    $.post($(this).attr('action'), $(this).serialize(), function(response){ 
     // HERE, clear the fields like... 
     $("#field_id_1").val(''); 
     $("#field_id_2").val(''); 
     // THEN do the redirect 
     window.location = response.redirectUrl; 
    }); 
}); 

它可能不是最全面的解決方案,但由於您使用的是Ajax調用做你的提交,無論如何,沒有理由不去做這樣。

+0

我剛剛看到表單有20多個條目。可能希望使用諸如「getElementsByName」之類的東西,然後循環遍歷它們而不是逐個清空它們。雖然方法相同。 – NappingRabbit

+0

我希望有一個更穩固的解決方案,但我會試試這個。通過ajax提交已經有點破解了。 –

+0

其實這個工程,所以你有我的upvote,但我不知道我想使用這個解決方案。 –