2010-01-27 54 views
2

如果我的用戶在表單的提交按鈕上單擊多次,他實際上會發送多個GET/POST請求(具體取決於表單的prefs)。禁止在HTML表單上多次提交

我發現禁用使用JS的提交按鈕有點問題,因爲如果用戶試圖停止(ESC /停止按鈕),它不會重置按鈕(除非你捕獲並再次處理使用JS ),如果用戶從下一頁回來(返回鍵),按鈕仍然(至少在Firefox)禁用提交。

什麼是禁止多重表單提交的最佳實踐。

謝謝!

+0

感謝pavium :) 我喜歡計算器越來越多! – Eli 2010-01-27 08:53:31

回答

2

的Javascript對我來說工作正常。確保在用戶放棄提交時啓用按鈕是可用性的一部分。

如果你不想使用JavaScript來禁用你的按鈕,那麼可能在服務器端你可以在特定的時間內捕獲重複的消息?

1

這可能不會回答你的問題,但我認爲生成一些uniq來識別服務器端的請求可能是一個更好的主意。客戶端驗證始終存在問題。

+0

我會與你同意這種說法。只需使用隱藏字段來保留隨表單一起提交的一次性值。值保持在服務器上,當請求到達時它會得到無效的,因此後續使用相同的密鑰請求都將被忽略。 很明顯,你可以使用JS魔法,但這是不可靠的。 – rytis 2010-01-27 09:12:15

1

綁定禁用的表單提交,然後其禁用頁面加載(當你刷新重置/回):

function disableSubmits(domNode, toDisable) 
{ 
    domNode = domNode || document.getElementsByTagName('body')[ 0 ]; 

    toDisable = !!toDisable; 

    for(var i = 0; i < inputs.length; ++i) 
    { 
     if('submit' === inputs[i].getAttribute('type')) 
     { 
      inputs[i].disabled = toDisable; 
     } 
    } 
} 

var onloadhandler = function() 
{ 
    var theForm = document.getElementById('theForm'); 

    theForm.onsubmit = function(){ disableSubmits(theForm, true); } 

    disableSubmits(theForm, false); 
}; 

var old = window.onload; 

window.onload = 'function' === typeof old 
       ? function(){ old(); onloadhandler(); } 
       : onloadhandler;