2011-10-25 4 views
1

제출 버튼을 사용하여 원격 마이크로 프로세서에 명령을 보내는 웹 사이트가 있습니다. 짧은 시간 내에 사용자가 제출 버튼을 너무 많이 여러 번 클릭하면 원격 마이크로 프로세서와 소프트웨어가 중단됩니다. 나는 각 "제출"버튼을 누르는 사이에 1 초의 지연을 추가하여 충돌을 일으킬 수 없다고 생각했다. 다음은 제출 버튼에 대한 것입니다. 양식 제출이 지연 될 수 있습니까?

이 나는 ​​형태로 onSubmit="setTimeout (1000)" 같은 것을 사용할 수 생각했지만, 제대로 동작하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

예 :

<form name="test" action="http://mydomain.dyndns.org/?8" target="results" method="POST" onSubmit="setTimeout (1000)"> 
    <input type="submit" value=" ← Move Left " /> 
</form> 
+1

이 작업을 수행하는 가장 좋은 장소는 백 엔드에 있다고 생각합니다. 자바 스크립트 만 사용하는 경우 쉽게 사용할 수 없으며 DoS 공격을받을 수 있습니다. – solartic

+0

+1. 모범적 인 질문! –

+0

제목이 잘못되었습니다. 제출 이벤트를 지연시키지 않으므로이를 방지 할 수 있습니다. –

답변

2

백 - 엔드 솔루션은 바람직하지만 당신은뿐만 아니라 (또는 대신) 그것을 클라이언트 측을 수행하려는 경우 :

거짓 당신의 onsubmit 반환이 제출 중단됩니다.

나는에 의해이 문제를 해결하는 경향 될 것

:

  1. 임시 않는 제출 후속 시도를 무시
  2. 을 사용자가 다시 빠르게 전송할 수 있도록 초 동안 버튼을 비활성화 및/또는 적어도 2 초가 지났습니다. 사용자가 버튼을 많은 시간을 클릭 할 수 있기 때문에

나는 모든 제출과 공간을 아웃 대기열하려고 귀찮게하지 않을 것입니다.

따라서 다음은 두 번째로 제출 된 추가 시도를 무시합니다. 은 제출 버튼을 비활성화합니다. 왜 둘 다합니까? 양식에 필드가 있으면 사용자가 Enter 키를 눌러 제출할 수 있습니다.

<form name="test" action="http://mydomain.dyndns.org/?8" target="results" 
     method="POST" onSubmit="return testSubmit();"> 
    <input id="submitButton" type="submit" value=" ← Move Left " /> 
</form> 

<script> 
    var allowSubmit = true; 

    function testSubmit() { 
     if (!allowSubmit) 
     return false; 

     allowSubmit = false; 
     document.getElementById("submitButton").disabled = true; 

     setTimeout(function() { 
        allowSubmit = true; 
        document.getElementById("submitButton").disabled = false; 
       }, 1000); 

     return true; 
    } 
</script> 

주 코드 : onSubmit="return testSubmit();" - 당신은 거기에서 "복귀"또는 폐기되고 제출이 방지되지 않습니다 testSubmit()에서 돌아 오는 값이 필요합니다.

3

당신은 실제로 요청을 대기하고 마이크로 프로세서가 안전하게 수용 할 수 어떤 속도로 마이크로 프로세서로 전송하는 코드를 작성해야합니다. 클라이언트 측이 아니라 서버 측에서이 작업을 수행해야합니다.

관련 문제