2009-11-07 2 views
2

나는 '기본 단추'가 바람직하지 않게 발사되는 오래된 문제에 대한 해결책이 필요합니다. 즉 입력란에 입력을 누르지 만 실행하려는 것이 아닌 양식에 제출 버튼이 있습니다 (아니면 양식이 전혀 실행되기를 원하지 않을 수도 있음).'발사에서 양식의 기본 단추 방지'문제에 대한 좋은 해결책은 무엇입니까?

다음 '해결책'에 대해 궁금합니다. 약간 hacky하지만 내가 말할 수있는 한 신뢰할 수 있어야합니다.

첫 번째 것은 보이지 않는 버튼입니다. 그런 다음 일부 jquery가 즉시이를 비활성화합니다. 양식에서 Enter 키를 누르면이 단추는 '기본 단추'로 계산되고 트리거되지만 'return false'이벤트 처리기로 인해 아무 것도 수행하지 않습니다.

솔루션 이전에 keydown 이벤트 처리기 또는 기타 모든 복잡한 브라우저/모든 브라우저에서 테스트하기 어려운 것에 의존했습니다.

내 솔루션 (이전에는 보지 못했지만 아마도 고유하지 않은 것 같습니다)은 훨씬 단순 해 보이며 신뢰할 만합니다. 서버가 양식 데이터에서이 버튼을 수신하기 때문에 자바 스크립트가 사용 중지되었는지 여부를 알 수 있습니다.

<form action="/store/checkout" method="post"> 

    <input id="btnFakeSubmit" name="FakeSubmit" src="/images/pixel.gif" 
    style="width:1px; height:1px; position:absolute;" type="image" /> 

     <script> 
      $('#btnFakeSubmit').click(function() { 
       return false; 
      }); 
     </script> 

모든 브라우저에서 버튼을 숨기는 가장 좋은 방법을 포함한이 솔루션에 대한 조언. 당신이 할 수

+0

Enter 키를 누르면 양식 아래에 "첫 번째"버튼이 표시됩니다. 그건 내 브라우저와 내 양식 (Firefox 3.5) – hasen

+0

@ happenily 내 원래의 질문은 '첫 번째 버튼을 모든 브라우저에서'트리거 된 다음 그것을 morphed 될거야 일어날 일이 아니에요. 흠, 병이 그걸 확인해야합니다. FF는 무엇을합니까? 키 이벤트 핸들러 또는 다른 것을 망친 라이브러리를 사용하지 않습니까? –

+0

FF가 무슨 일을하는지 잘 모르겠다. 나는 그 일이 일어난다 고 생각하지만, 더 이상의 검사를 받으면 그럴 것 같지 않다. 적어도 제출 버튼이 없다면; 그것은 아무것도하지 않는 것 같습니다. – hasen

답변

6

한 가지입니다

  • 가 전송을 수행 다른 버튼 만들기 버튼을
  • 를 제출 만들지 마십시오 javascript: return false;
  • 에 제출 조치를 설정하고, 양식의 작업을 실제 주소로 변경하는 함수를 호출 한 다음 폼 개체에서 submit()을 호출합니다.

<form id="myform" action="javascript: return false"> 
.... 
<input type="button" onclick="submit_myform"> 
... 

function submit_myform() 
{ 
    jQuery("#myform").attr("action", "post.php").submit(); //untested 
} 

이렇게하면이 버튼을 명시 적으로 누르지 않고 양식을 제출할 수 없습니다.

+0

당신이 말하는 jquery로 너무 영리 해 지려고합니다. 이것은 '진보적 인 향상'을위한 시간은 거의 없습니다. –

+0

id 대신 오히려 onClick = "javscript : return false;" INPUT 컨트롤에 있습니다. 나는 가장 영향력있는 안정적인 솔루션을 찾고 있습니다. 다른 이벤트가 이미 연결되어 있다면 양식 제출을 어지럽히고 싶지 않습니다. 나는 네가 옳은 일을 제안했음을 생각하니? –

+0

제 아이디어는 "일반적인"제출 버튼이 없다는 것입니다. 그 입력 컨트롤은 사용자가 볼 수있는 유일한 "submit"버튼입니다. – hasen

0

그냥 한 가지 이상의 제출 버튼이 필요한데 왜 모든 브라우저에서 숨길까요?

0

당신은 (대부분) 올바른 방향으로 가고 있습니다. 먼저 제출 버튼이 필요합니다. 제출

#dummy { display: none; } 

그리고 비활성화 :

$(function() { 
    $("#dummy").click(function() { 
    return false; 
    }); 
}); 

을 당신이 사람들을 맞추려면 지금 그것을 숨길

<input id="dummy" name="dummy" type="submit"> 

: 이것은 매우 첫 번째 형태의 버튼을 제출해야한다 Javascript가 비활성화 된 상태에서 POST/GET (적절한 경우) 변수에 "dummy"라는 변수가 있는지 확인합니다 (실제로 제출 버튼이 눌러지면 보내집니다). 받은 경우 양식을 그대로 사용자에게 보냅니다. 대부분의 경우에는 Javascript가 비활성화 된 사람들을 위해 취사를 할만한 가치가 없습니다.

자바 스크립트가 동작과 다른 방법으로 엉망으로 만들어 지기만하면 양식 제출을 허용 할 수 있지만 너무 무거울 수 있습니다.

+0

버튼에'제출 '하지 말아야합니다. ISTR 일부 브라우저는'display : none'을 좋아하지 않고 그 경우 버튼을 무시합니다. 내가 기억하는 것에서 나는 그걸 감추려하지 않고 숨겼다. – bobince

0
<script> 
var statusSend = valse; 
var checkSend = function(){return statusSend;} 
</script> 

<form id="myForm" action="/store/checkout" method="post" onSubmit="return checkSend();"> 
... 
<button id="myButton">Send Data</button> 
</form> 

<script> 
$("#myButton").click(function(e){ 
    e.stopPropagation(); 
    //check data ok 
    statusSend = true; 
    $("#myForm").submit(); 
}); 
</script> 
6

다음은 ASP.net 프로젝트에서이 문제를 해결하는 방법입니다.

<form runat="server" defaultbutton="DoNothing"> 
     <asp:Button ID="DoNothing" runat="server" Enabled="false" style="display: none;" /> 
+0

더러운,하지만 완벽하게 작동합니다 :) – NinjaCross