2015-11-05 62 views
0

我有一個HTML表單,它有時會提交,有時不提交。該表單是使用一個按鈕來驗證表單,然後使用javascript來提交,如下所示:HTML表單並不總是提交

<form id="my-form"> 
    <input type="hidden" name="csrf-token"> 
    <input type="text" name="1"> 
    <input type="text" name="2"> 
    <button onclick="validateForm()"> 
</form> 

<script> 
    function validateForm() { 
    // Validate rules here 
    document.forms['my-form'].submit(); 
    } 
</script> 

它非常直截了當。然後將數據發送到服務器,檢查csrf標記,然後將輸入保存到數據庫中。我試圖理解爲什麼表單不會一直提交。有時,當我點擊提交按鈕時,頁面只是重新加載,而其他時間表單被保存到數據庫並且我被重定向到下一頁時,數據就消失了。

從我所能猜到的,我認爲這可能與到期有關。如果開始表格並且放置太長時間,則不會提交。我每次提交表格都會立即提交。但是,有時候,當我將表單放置太久時,它會提交。

你可以想象這有多令人沮喪,因爲輸入的數據有時會丟失。這個問題的原因是什麼?謝謝。

+0

你的'validateForm'的內部可能很重要,你能分享完整的功能嗎? – Whymarrh

+0

檢查瀏覽器中的調試控制檯。 –

+0

@Whymarrh我在這裏有完整的非簡化版本:pastebin.com/zG0zWLJc –

回答

0

解決方案:
添加type="button"屬性您<button>。這會阻止表單處理您的按鈕,如submit按鈕。

說明:
「有時它有效」通常意味着您有競爭條件。您的競爭條件介於您的JavaScript和默認瀏覽器行爲之間。 <button>的默認type屬性是submit。示例代碼中的表單沒有actionmethod屬性。在這些條件下,表單的默認行爲將是在點擊按鈕時爲當前url執行GET。按鈕點擊也將運行您的JavaScript。但取決於默認行爲重新加載頁面的速度有多快(或者驗證速度有多慢),您的javascript submit可能會受到影響,也可能不受影響。

0

從我的角度來看,您正在使用CSRF令牌。 CSRF令牌具有基於您使用的框架/ CMS的到期時間。這是非常可配置的。

現在會發生的情況是,當CSRF令牌到期時,輸入被服務器拒絕。這可能是你的情況。要檢查這一點,請保持打開並在很長時間後提交,如果相同的問題重複出現,請使用下面的解決方案,否則這不是您的情況。

一個簡單的解決方案是增加CSRF令牌的到期時間並檢查現象是否重複。