ENTER 키를 눌러 웹 양식을 제출하지 못하게하는 방법은 무엇입니까?


207

ENTER웹 기반 응용 프로그램에서 키 누르기가 양식을 제출 하지 못하게하려면 어떻게합니까 ?

답변:


99

[ 개정 2012, 인라인 핸들러 없음, 텍스트 영역 입력 처리 유지]

function checkEnter(e){
 e = e || event;
 var txtArea = /textarea/i.test((e.target || e.srcElement).tagName);
 return txtArea || (e.keyCode || e.which || e.charCode || 0) !== 13;
}

이제 <form [...] onkeypress = "return checkEnter (event)"> 형식으로 키 누르기 핸들러를 정의 할 수 있습니다.

document.querySelector('form').onkeypress = checkEnter;

3
그건 그렇고 : 당신은 텍스트 영역을 제외하기 위해 checkEnter 함수에서 입력 유형에 대한 검사 (이벤트 소스를 통해)를 추가 할 수 있습니다.
— KooiInc

1
공장. <enter>가 양식을 제출하지 않기를 원했기 때문에 이것을 단일 입력에 추가했습니다. 내부 검색을 수행 할 수있는 버튼이 있으며 실제로 사용성을 향상시킵니다.
— Foxinni

1
이 접근 방식의 한 가지 문제점 (전체적으로 양식에 이벤트 핸들러와 함께이 기능을 사용함)은 또한 입력이 일반적으로 바람직한 형식 인 텍스트 영역에서 입력이 발생하는 것을 방지한다는 것입니다.
— Lonnie Best

1
@LonnieBest : 알려 주셔서 감사합니다. 당신은 않았다 (위 참조)이 답변에 대한 내 의견을 당신을했다 읽어? 어쨌든, 나는이 오래된 대답을 수정했습니다.
— KooiInc

1
@Jonathan : 처리기를 전체 입력 형식 대신 단일 입력 필드 또는 입력 필드 컬렉션 (버튼이 아닌)이 포함 된 일부 div에 연결할 수 있습니다.
— KooiInc

57

다음은 제출 제출을 중지하고 백 스페이스 키-> 뒤로를 중지하는 데 사용할 수있는 jQuery 핸들러입니다. "keyStop"객체의 (keyCode : selectorString) 쌍은 기본 동작을 실행하지 않아야하는 노드를 일치시키는 데 사용됩니다.

웹은 접근하기 쉬운 장소 여야하며 이는 키보드 사용자의 기대를 상회하고 있습니다. 내 경우에는 작업중 인 웹 응용 프로그램이 뒤로 버튼을 좋아하지 않으므로 키 바로 가기를 비활성화하는 것이 좋습니다. "입력해야합니다-> 제출"토론은 중요하지만 실제 질문과는 관련이 없습니다.

접근성에 대해 생각하고 실제로 왜 그렇게하고 싶은지에 대한 코드는 다음과 같습니다!

$(function(){
 var keyStop = {
   8: ":not(input:text, textarea, input:file, input:password)", // stop backspace = back
   13: "input:text, input:password", // stop enter = submit 

   end: null
 };
 $(document).bind("keydown", function(event){
  var selector = keyStop[event.which];

  if(selector !== undefined && $(event.target).is(selector)) {
      event.preventDefault(); //stop event
  }
  return true;
 });
});

12
가장 간단한 방법 : $ ( "# myinput"). keydown (function (e) {if (e.which == 13) e.preventDefault ();}); 핵심은 "keydown"과 event.preventDefault ()를 함께 사용하는 것입니다. "키업"에서는 작동하지 않습니다.
— lepe

이것은 브라우저의 자동 제안이 계속 제대로 작동한다는 열쇠 13을 단순히 차단하는 다른 솔루션보다 이점이 있습니다.
— jsalvata

52

제출시 핸들러에서 단순히 false를 리턴하십시오.

<form onsubmit="return false;">

또는 중간에 처리기를 원한다면

<script>
var submitHandler = function() {
  // do stuff
  return false;
}
</script>
<form onsubmit="return submitHandler()">

5
이것은 가장 간단한 대답 인 것 같습니다. Chrome에서 시도했지만 정상적으로 작동합니다. 모든 브라우저에서 이것을 테스트 했습니까?
— styfle 2019 년

22
submit버튼 을 눌러 양식을 제출하려면 좋지 않습니다.
— AliBZ

13
제출 단추가 더 이상 양식을 제출하지 않기 때문에 작동하지 않습니다.
— paullb

39
@Paul, 이것은 어떻게 38 공세를 얻었습니까? 중지 <form>제출하기에서 전혀은 목욕물과 함께 아기를 밖으로 던지는 것입니다.
— Pacerier

8
@Pacerier SPA 환경에서는 거의 항상 양식 제출을 수동으로 처리하려고합니다. 이 경우 브라우저가 항상 양식을 제출하지 못하게하고 페이지를 새로 고치면 응용 프로그램이 다시 시작됩니다.
— Nathan Friend

44
//Turn off submit on "Enter" key

$("form").bind("keypress", function (e) {
    if (e.keyCode == 13) {
        $("#btnSearch").attr('value');
        //add more buttons here
        return false;
    }
});

5
이것은 잘 작동합니다. e.preventDefault()오히려 return false같은 목표를 달성하지만 이벤트가 상위 요소의 핸들러에 도달하도록 허용합니다. 기본 동작 (양식 summission)는 여전히 방지 할 것
— willscripted

24

폼의 기본 제출 동작을 취소하면이 함수를 호출해야합니다. 모든 입력 필드 또는 이벤트에 첨부 할 수 있습니다.

function doNothing() {  
var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
    if( keyCode == 13 ) {


    if(!e) var e = window.event;

    e.cancelBubble = true;
    e.returnValue = false;

    if (e.stopPropagation) {
        e.stopPropagation();
        e.preventDefault();
    }
}

2
e는 인수 여야하며 window.event를 확인해야합니다. 또한 이벤트에서 키 코드를 가져와야합니다. 마지막으로 false를 반환해야합니다.
— ntownsend

9
이 함수를 어디서 어떻게 호출하는지 설명해 주시겠습니까?
— mydoghasworms

17

ENTER 키는 양식의 기본 제출 버튼 만 활성화합니다.

<input type="submit" />

브라우저는 양식 내에서 찾습니다.

따라서 제출 버튼이 없지만 다음과 같은 것이 있습니다.

<input type="button" value="Submit" onclick="submitform()" /> 

편집 : 의견 토론에 대한 답변 :

텍스트 필드가 하나만 있으면 작동하지 않지만이 경우 원하는 동작 일 수 있습니다.

다른 문제는 양식을 제출하기 위해 Javascript에 의존한다는 것입니다. 접근성의 관점에서 문제가 될 수 있습니다. <input type='button'/>with with javascript 를 작성한 다음 태그 <input type='submit' />안에 넣어서 해결할 수 있습니다 <noscript>. 이 방법의 단점은 자바 스크립트가 비활성화 된 브라우저의 경우 ENTER에 양식을 제출한다는 것입니다. 이 경우 원하는 동작을 결정하는 것은 OP에 달려 있습니다.

나는 자바 스크립트를 전혀 호출하지 않고이 작업을 수행 할 수있는 방법을 모른다.


필드가 하나만 있으면 Firefox에서 작동하지 않습니다.
— DanSingerman

5
접근성이 끔찍한가요? 아마도. 그러나 그것은 않습니다 에 대한 ... 어쩌면 대답에 편집 접근성 문제가 좋은 타협입니다 지적이다 SO 것입니다 그들은 사람의 질문에 대답?
— Neil Barnwell

1
@bobince-아마도 접근성으로 인해 질문에 -1이 필요하지만 질문에 대한 정확한 답변입니까? 그렇게 생각하지 마십시오. 또한이를 수행하려는 유효한 사용 사례가 있습니다.
— DanSingerman

그러나 JavaScript없이 제출할 수 없도록 양식을 만들 필요는 없습니다. 브라우저가 제출 버튼이없는 양식을 행복하게 제출하기 때문에 작동하지 않는 경우입니다.
— bobince

2
하나의 텍스트 입력과 하나의 입력 버튼으로 Opera와 Plus에서 테스트되었습니다. 모두 Enter 키에 양식을 제출했습니다. Enter 문제를 '해결'하려면 분명히 JavaScript가 필요하지만 JS를 사용할 수없는 경우 페이지를 완전히 사용할 수 없게 만드는 것이 중요합니다.
— bobince

12

순수한 자바 스크립트의 짧은 대답은 다음과 같습니다.

<script type="text/javascript">
    window.addEventListener('keydown', function(e) {
        if (e.keyIdentifier == 'U+000A' || e.keyIdentifier == 'Enter' || e.keyCode == 13) {
            if (e.target.nodeName == 'INPUT' && e.target.type == 'text') {
                e.preventDefault();
                return false;
            }
        }
    }, true);
</script>

입력 유형 = 'text'에 대한 "Enter"키 누르기 동작 만 비활성화합니다. 방문자는 여전히 웹 사이트 전체에서 "Enter"키를 사용할 수 있습니다.

다른 조치에도 "Enter"를 사용하지 않으려면 console.log (e); 테스트 목적으로 크롬에서 F12 키를 누르고 "콘솔"탭으로 이동하여 페이지에서 "백 스페이스"를 누르고 내부를 살펴보고 어떤 값이 반환되는지 확인한 다음 해당 매개 변수를 모두 타겟팅하여 코드를 더욱 향상시킬 수 있습니다 "e.target.nodeName" , "e.target.type" 등에 대한 귀하의 요구에 적합합니다 .

비슷한 질문에 대한 자세한 답변을 보려면 여기를 클릭하십시오.


3
실제로이어야합니다 e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'. 지정된 코드를 사용하면 라디오 또는 확인란에 초점을 맞춘 경우 양식을 제출할 수 있습니다.
— afnpires

1
가장 효과적이고 리소스 친화적 인 솔루션입니다. @AlexandrePires에게 감사합니다! 내 전체 작업 스크립트는 다음과 같습니다. stackoverflow.com/a/40686327/1589669
— eapo

1
유일한 작업 솔루션; 적어도 내 상황에서는
— hex494D49

9

이 주제, 여기 또는 다른 게시물에서 찾은 모든 답변에는 한 가지 단점이 있으며 이는 양식 요소의 실제 변경 트리거를 방지합니다. 따라서 이러한 솔루션을 실행하면 onchange 이벤트도 트리거되지 않습니다. 이 문제를 극복하기 위해 이러한 코드를 수정하고 다음 코드를 직접 개발했습니다. 나는 이것이 다른 사람들에게 유용하기를 바랍니다. "prevent_auto_submit"형식의 클래스를 제공하고 다음 JavaScript를 추가했습니다.

$(document).ready(function() 
{
    $('form.prevent_auto_submit input,form.prevent_auto_submit select').keypress(function(event) 
    { 
        if (event.keyCode == 13)
        {
            event.preventDefault();
            $(this).trigger("change");
        }
    });
});

7

나는 항상 과거에 위와 같은 키 누르기 핸들러로 그것을 해왔지만 오늘은 더 간단한 해결책을 강타했습니다. Enter 키는 양식에서 비활성화되지 않은 첫 번째 제출 단추를 트리거하므로 실제로 필요한 것은 제출하려는 단추를 가로채는 것입니다.

<form>
  <div style="display: none;">
    <input type="submit" name="prevent-enter-submit" onclick="return false;">
  </div>
  <!-- rest of your form markup -->
</form>

그게 다야. 키 누르기는 브라우저 / 필드 / 등에서 평소와 같이 처리됩니다. 입력 제출 논리가 트리거되면 브라우저는 숨겨진 제출 단추를 찾아서 트리거합니다. 그러면 자바 스크립트 핸들러는 서브 미션을 방지합니다.


1
일반적으로 나는 핵을 좋아하지 않지만 이것은 실제로 효과적입니다.
— TechWisdom

1
div를 제거하고 hidden입력 에 attr 을 넣으면 짧아집니다. 멋진 해킹 :)
— Nik

5

IE8,9,10, Opera 9+, Firefox 23, Safari (PC) 및 Safari (MAC) 용 크로스 브라우저를 만드는 데 시간을 보냈습니다.

JSFiddle 예 : http://jsfiddle.net/greatbigmassive/ZyeHe/

기본 코드-양식에 첨부 된 "onkeypress"를 통해이 함수를 호출하고 "window.event"를 전달하십시오.

function stopEnterSubmitting(e) {
    if (e.keyCode == 13) {
        var src = e.srcElement || e.target;
        if (src.tagName.toLowerCase() != "textarea") {
            if (e.preventDefault) {
                e.preventDefault();
            } else {
                e.returnValue = false;
            }
        }
    }
}

4
stopSubmitOnEnter (e) {
  var eve = e || window.event;
  var keycode = eve.keyCode || eve.which || eve.charCode;

  if (keycode == 13) {
    eve.cancelBubble = true;
    eve.returnValue = false;

    if (eve.stopPropagation) {   
      eve.stopPropagation();
      eve.preventDefault();
    }

    return false;
  }
}

그런 다음 양식에 :

<form id="foo" onkeypress="stopSubmitOnEnter(e);">

그러나 눈에 잘 띄지 않는 JavaScript를 사용하지 않는 것이 좋습니다.


나는이 버전이 @hash에 의한 것보다 더 읽기 쉽기 때문에이 버전을 좋아한다. 그러나 한 가지 문제는 "if (keycode == 13)"블록 내에서 false를 반환해야합니다. 이 기능을 사용하면 필드에서 키보드 입력을 방지 할 수 있습니다. 또한 @hash의 버전에는 e.keyCode, e.which 및 e.charCode가 포함되어 있습니다 .e.charCode가 중요한지 확실하지 않지만 어쨌든 거기에 넣습니다. "var keycode = eve.keyCode || eve.which || eve.charCode; ".
— 잭 세네갈

고마워, 잭 에 대한 답변을 수정했습니다 charCode. 나는 또한 return falseif-block 내부를 움직였다 . 잘 잡았습니다.
— ntownsend

3

제 경우에는이 jQuery JavaScript가 문제를 해결했습니다.

jQuery(function() {
            jQuery("form.myform").submit(function(event) {
               event.preventDefault();
               return false;
            });
}

감사합니다 @Kirby! 이제 Enter 키가 양식에서 비활성화되었으므로 양식 <input>내의 모든 필드에 대해 Enter 키를 어떻게 활성화 할 수 있습니까?
— Ian Campbell

3

"ENTER"가 양식을 제출하지 못하게하면 일부 사용자에게 불편을 줄 수 있습니다. 따라서 아래 절차를 따르면 더 좋습니다.

양식 태그에 'onSubmit'이벤트를 작성하십시오.

<form name="formname" id="formId" onSubmit="return testSubmit()" ...>
 ....
 ....
 ....
</form>

다음과 같이 Javascript 함수를 작성하십시오.

function testSubmit(){
  if(jQuery("#formId").valid())
      {
        return true;
      }
       return false;

     } 

     (OR)

이유가 무엇이든, Enter 키를 눌렀을 때 양식 제출을 막으려면 다음 함수를 자바 스크립트로 작성할 수 있습니다.

    $(document).ready(function() {
          $(window).keydown(function(event){
          if(event.keyCode == 13) {
               event.preventDefault();
               return false;
              }
           });
         });

감사.


3

이 태그를 양식에 추가하십시오. onsubmit="return false;" 그러면 JavaScript 함수를 사용하여 양식을 제출할 수 있습니다.


OP는 (이 브라우저 기능으로 물린 사람의 대부분과 마찬가지로) 마우스 클릭으로 제출하는 것을 여전히 원했을 것입니다. 이 문제를 해결하는 좋은 방법은 없지만, 예를 들어 Adam의 위의 답변 (이 시점에서)이 더 나은 작업을 수행합니다.
— Sz.

3

누르면 양식을 제출 방지하기 위해 enterA의 textarea또는 input필드에이 요소의 종류가 이벤트를 보낼 것을 찾기 위해 이벤트를 제출 확인.

실시 예 1

HTML

<button type="submit" form="my-form">Submit</button>
<form id="my-form">
...
</form>

jQuery

$(document).on('submit', 'form', function(e) {
    if (e.delegateTarget.activeElement.type!=="submit") {
        e.preventDefault();
    }
});

더 좋은 해결책은 제출 버튼이없고 일반 버튼으로 이벤트를 시작하는 것입니다. 첫 번째 예에서는 2 개의 제출 이벤트가 발생하지만 두 번째 예에서는 1 개의 제출 이벤트 만 발생하기 때문에 더 좋습니다.

실시 예 2

HTML

<button type="button" onclick="$('#my-form').submit();">Submit</button>
<form id="my-form">
...
</form>

jQuery

$(document).on('submit', 'form', function(e) {
    if (e.delegateTarget.activeElement.localName!=="button") {
        e.preventDefault();
    }
});

3

이보다 더 간단하고 유용합니다. : D

$(document).on('submit', 'form', function(e){
    /* on form submit find the trigger */
    if( $(e.delegateTarget.activeElement).not('input, textarea').length == 0 ){
        /* if the trigger is not between selectors list, return super false */
        e.preventDefault();
        return false;
    } 
});

2

어때요?

<asp:Button ID="button" UseSubmitBehavior="false"/>

2

이 기사를 확인하십시오 웹 양식을 제출하기 위해 ENTER 키 누르기를 방지하는 방법은 무엇입니까?

$(“.pc_prevent_submit”).ready(function() {
  $(window).keydown(function(event) {
    if (event.keyCode == 13) {
      event.preventDefault();
      return false;
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form class=”pc_prevent_submit” action=”” method=”post”>
  <input type=”text” name=”username”>
  <input type=”password” name=”userpassword”>
  <input type=”submit” value=”submit”>
</form>


1

자바 스크립트로 양식에 키 다운을 붙일 수 있고 거품을 방지 할 수 있다고 생각합니다. 웹 페이지의 ENTER는 기본적으로 현재 선택된 컨트롤이 배치 된 양식을 제출합니다.


제어 영역에 따라 다릅니다.;) 텍스트 영역에서 다음 줄로 이동합니다. 따라서 모든 'enter'키 누르기 이벤트를 잡는 것은 좋은 생각이 아닙니다.
— kender

어쨌든 양식에 어쨌든 키 다운 이벤트가 있습니까?
— Neil Barnwell

모든 입력 유형 텍스트 및 기타 유사한 컨트롤에서 직접 수행합니다. 그것은 약간의 고통이며 실제로 대부분의 경우 귀찮게 할 가치가 없지만, 당신이해야한다면 ...
— bobince

1

이 링크는 Chrome, FF 및 IE9에서 저에게 효과적 인 솔루션과 IE9의 개발자 도구 (F12)와 함께 제공되는 IE7 및 8의 에뮬레이터를 제공합니다.

http://webcheatsheet.com/javascript/disable_enter_key.php


링크가 끊어진 경우이 코드를 페이지의 헤더 영역에 추가하십시오. <script type="text/javascript"> function stopRKey(evt) { var evt = (evt) ? evt : ((event) ? event : null); var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null); if ((evt.keyCode == 13) && (node.type=="text")) {return false;} } document.onkeypress = stopRKey; </script>
— Miaka

1

또 다른 방법은 제출 입력 버튼을 제출해야 할 때만 양식에 추가하고 양식 작성 중에 간단한 div로 대체하는 것입니다.


1

이 속성을 FORM 태그에 추가하면됩니다.

onsubmit="return gbCanSubmit;"

그런 다음 SCRIPT 태그에 다음을 추가하십시오.

var gbCanSubmit = false;

그런 다음 버튼을 만들거나 함수와 같은 다른 이유로 최종 제출을 허용하면 전역 부울을 뒤집고 다음 예제와 같이 .submit () 호출을 수행하십시오.

function submitClick(){

  // error handler code goes here and return false if bad data

  // okay, proceed...
  gbCanSubmit = true;
  $('#myform').submit(); // jQuery example

}

1

다른 'name'값을 가진 여러 개의 제출 버튼이 있으므로 제출했을 때 동일한 PHP 파일에서 다른 작업을 수행하기 때문에이 문제를 직접 경험했습니다. enter/의 return그 값으로 버튼 바꿈이 제출되지 않습니다. 그래서 enter/ return버튼은 양식의 첫 번째 제출 버튼을 활성화합니까? 이렇게하면 숨겨 지거나 'name'값이있는 'vanilla'제출 버튼을 사용하여 실행중인 PHP 파일을 양식이있는 페이지로 되돌릴 수 있습니다. 그렇지 않으면 키 누르기가 활성화하는 기본 (숨겨진) 'name'값이 있고 제출 단추가 자체 'name'값으로 겹쳐 씁니다. 그냥 생각이야


1

어때요?

<script>
function isok(e) {
  var name = e.explicitOriginalTarget.name;
  if (name == "button") {
    return true
  }
  return false;
}
</script>
<form onsubmit="return isok(event);">
<input type="text" name="serial"/>
<input type="submit" name="button" value="Create Thing"/>
</form>

버튼 이름을 오른쪽으로 지정해도 여전히 제출되지만 텍스트 필드, 즉 returnO를 입력하면 explicitOriginalTarget과 같은 텍스트 필드는 올바른 이름을 갖지 않습니다.


0

이것은 나를 위해 일했습니다.
onkeydown = "반환! (event.keyCode == 13)"

    <form id="form1" runat="server" onkeydown="return !(event.keyCode==13)">

   </form>

1
텍스트 영역이있는 경우 동일한 양식으로 입력 할 때 다음 행으로 이동할 수 없습니다.
— Aamir Afridi

0

내가하는 방법은 다음과 같습니다.

window.addEventListener('keydown', function(event)
{
    if (event.key === "Enter")
    {
        if(event.target.type !== 'submit')
        {
            event.preventDefault();
            return false;
        }
    }
}

-1

자바 스크립트 외부 파일에 넣어

   (function ($) {
 $(window).keydown(function (event) {  

    if (event.keyCode == 13) {

        return false;
    }
});

 })(jQuery);

또는 body 태그 내부 어딘가에

<script>


$(document).ready(function() {
    $(window).keydown(function(event) {
        alert(1);

        if(event.keyCode == 13) {

            return false;
        }
    });
});

</script>

-2

나는 같은 문제가 있었다 (많은 텍스트 필드와 숙련되지 않은 사용자를 가진 양식).

나는 이런 식으로 그것을 해결했다 :

function chkSubmit() {
    if (window.confirm('Do you want to store the data?')) {
        return true;
    } else {
        // some code to focus on a specific field
        return false;
    }
}

HTML 코드에서 이것을 사용하여 :

<form
    action="go.php" 
    method="post"
    accept-charset="utf-8"  
    enctype="multipart/form-data"
    onsubmit="return chkSubmit()"
>

이러한 방식으로 ENTER키가 계획대로 작동하지만 확인 ( ENTER보통 두 번째 탭)이 필요합니다.

나는 ENTER양식을 유지하기로 결정한 경우 사용자가 누르는 필드에서 사용자를 보내는 스크립트에 대한 퀘스트를 독자들에게 맡깁니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.