2010-01-27 1 views
2

사용자가 양식의 제출 버튼을 두 번 이상 클릭하면 본질적으로 서식에 따라 여러 개의 GET/POST 요청을 보냅니다.HTML 양식에서 다중 제출 사용 안함

JS를 사용하여 제출 버튼을 사용 중지하는 것은 다소 문제가있는 것으로 나타났습니다. 사용자가 (ESC/중지 버튼)을 중지하려고 시도하면 버튼을 재설정하지 않기 때문에), 사용자가 다음 페이지에서 돌아 오는 경우 ("뒤로 버튼"), 제출 버튼은 여전히 ​​비활성화되어 있습니다 (적어도 Firefox에서는).

여러 양식 제출을 사용하지 않도록 설정하는 가장 좋은 방법은 무엇입니까?

감사합니다.

+0

감사합니다! – Eli

답변

2

자바 스크립트가 제대로 작동합니다. 사용자가 제출을 취소 할 때 버튼이 다시 활성화되었는지 확인하는 것은 유용성의 일부입니다.

자바 스크립트를 사용하여 버튼을 비활성화하지 않으려면 서버 측에서 특정 시간대에 중복 메시지를 잡을 수 있습니까?

1

이 질문에 대한 답변을하지 못할 수도 있지만 서버 측에서 요청을 식별하는 데있어 고유 한 것을 생성하는 것이 더 좋은 아이디어 일 수 있다고 생각합니다. 클라이언트 측 유효성 검사는 항상 문제가 있습니다.

+0

나는 이것에 동의 할 것이다. 숨겨진 필드를 사용하여 양식과 함께 제출되는 일회용 값을 유지하십시오. 값은 서버에 보관되며 요청이 들어 오면 무효화되므로 동일한 키를 가진 후속 요청은 무시됩니다. 분명히 JS 마법을 사용할 수는 있지만 신뢰할 수는 없습니다. – rytis

1

바인딩 해제 폼의 (/ 당신이 새로 고칠 때 다시 돌아 가야) 제출하고 페이지로드에 다음의 비활성화 : 나는 더 많은 유래 좋아 pavium :

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;