트리거 입력 버튼 클릭


168

두 개의 버튼이있는 페이지가 있습니다. 하나는 <button>요소이고 다른 하나는 <input type="submit">입니다. 버튼은 순서대로 페이지에 나타납니다. 양식의 아무 곳이나 텍스트 필드에 있고를 누르면 <Enter>버튼 요소의 click이벤트가 트리거됩니다. 버튼 요소가 먼저 있기 때문이라고 생각합니다.

기본 버튼을 설정하는 안정적인 방법처럼 보이는 것을 찾을 수 없으며이 시점에서 필자가 원하는 것도 아닙니다. 더 나은 것이 없으면 양식의 어느 곳에서나 키 누르기를 캡처했으며 키를 누른 경우 <Enter>부정하고 있습니다.

$('form').keypress( function( e ) {
  var code = e.keyCode || e.which;

  if( code === 13 ) {
    e.preventDefault();
    return false; 
  }
})

내가 지금까지 알 수있는 한, 그것은 효과가있는 것처럼 보이지만 엄청나게 햄이 느껴집니다.

누구 든지이 작업을 수행하는보다 정교한 기술을 알고 있습니까?

마찬가지로, 내가 모르는이 솔루션에 대한 함정이 있습니까?

감사.


1
이것은 JQuery뿐만 아니라 각도 개발에도 유용한 각도 반응 양식을 사용할 때 발생할 수 있습니다.
HDJEMAI

답변:


362

사용

<button type="button">Whatever</button>

트릭을해야합니다.

그 이유는 양식 내부의 단추 유형이 암시 적으로로 설정되어 있기 때문 submit입니다. zzzzBoz 말하는 것처럼, 사양은 첫째 말한다 button또는 input으로는 type="submit"이 상황에서 트리거 될 것입니다. 특별히을 설정 type="button"하면 브라우저에서 고려하지 않습니다.


1
달콤한, 감사합니다, <enter> 클릭을 캡처하기 위해 IE8의 버튼처럼 type="button"보입니다.이 문제를 해결하는 것 같습니다 ... 감사합니다! 왜 이런지에 대한 아이디어가 있습니까? ie8 버튼을 타입 제출로 취급합니까? 기묘한.
Quang Van

3
좋은 대답은 버튼을 제출하지 않은 버튼을 브라우저에 암시하여 마크 업을 다시 정렬하지 않고도 올바른 작업을 수행 할 수 있다는 것입니다.
돈 스폴딩

2
@Leinster의 답변은이 기발한 이유를 설명합니다. "유형 속성이없는 버튼은 유형이 제출 된 버튼과 동일하게 취급됩니다."
양동이

2
동일은 적용 <input type="submit"/>(클릭 트리거)와 <input type="button"/>(하지 않습니다 트리거 클릭)
마리우스 Balčytis

1
믿을 수 없는!! 나는 너무 혼란 스러웠다.
Margus Pala

54

예상되는 동작을 실제로 이해하려면 HTML 사양을 읽어야합니다.

HTML5 스펙이 명시 적으로 일어나는 상태implicit submissions :

양식 요소의 기본 버튼은 양식 소유자가 해당 양식 요소 인 트리 순서의 첫 번째 제출 버튼입니다.

사용자 에이전트가 사용자가 양식을 암시 적으로 제출할 수 있도록 지원하는 경우 (예를 들어, 텍스트 필드에 포커스가있는 동안 "enter"키를 치는 일부 플랫폼에서 양식은 암시 적으로 양식을 제출 함) 기본 단추가 정의 된 활성화 된 양식에 대해 수행 이 동작으로 인해 사용자 에이전트는 해당 기본 버튼에서 합성 클릭 활성화 단계를 실행해야합니다.

이것은 HTML4 사양에서 명시 적으로 만들어지지 않았지만 브라우저는 이미 HTML5 사양에 설명 된 내용을 구현하고 있습니다 (이것이 명시 적으로 포함 된 이유입니다).

추가하려면 다음을 편집하십시오.

내가 생각할 수있는 가장 간단한 대답은 제출 버튼을 [type="submit"]양식 의 첫 번째 항목 으로 넣고 CSS로 양식 맨 아래에 패딩을 추가하고 제출 버튼을 원하는 맨 아래에 배치하는 것입니다.


거기에서 나는 IE를 저주하고 있었고, 그것은 내 조잡한 마크 업이었다. 건배!
Shawson

2
와 ... 감사합니다 우연히 발견되었습니다. 클릭 이벤트가 Enter 키를 쳐서 발생하는 이유를 알 수 없었지만 인용문으로 나를 w3.org/TR/html5/forms.html#implicit-submission
chemoish

링크가 끊어졌습니다. w3c.github.io/html/sec-forms.html#implicit-submission 이 새로운 URL 이라고 생각 합니다.
TJ.

22

이 문제를 해결하기 위해 자바 스크립트 또는 CSS가 필요하다고 생각하지 않습니다.

버튼대한 HTML 5 스펙에 따르면, 타입 속성이없는 버튼은 타입이 "submit"으로 설정된 버튼, 즉 포함 양식을 제출하기위한 버튼과 동일하게 취급됩니다. 버튼 유형을 "버튼"으로 설정하면 현재 보이는 동작을 막을 수 있습니다.

브라우저 지원에 대해서는 확실하지 않지만 버튼 에 대한 html 4.01 스펙에 동일한 동작이 지정 되었으므로 꽤 좋습니다.


13

초점을 맞추고 'Enter'를 누르면 <input type="text">첫 번째 위치 요소에서 'click'이벤트가 트리거됩니다 : <button>또는 <input type="submit">. 에서 'Enter'를 누르면 <textarea>새 텍스트 줄만 만듭니다.

여기 예를 참조 하십시오 .

코드에서에 새로운 텍스트 줄을 만들지 못 <textarea>하므로 키만 눌러야합니다.<input type="text"> .

그러나 왜 Enter텍스트 필드 를 눌러야 합니까? 'Enter'를 눌러 양식을 제출하고 싶지만 <button>레이아웃에서 첫 번째를 유지 해야하는 경우 마크 업으로 재생 <input type="submit">하십시오.<button> 사용 CSS를 사용하여 필요한 레이아웃을 저장하십시오.

'Enter'잡기 및 마크 업 저장 :

$('input[type="text"]').keypress(function (e) {
    var code = e.keyCode || e.which;
    if (code === 13)
    e.preventDefault();
    $("form").submit(); /*add this, if you want to submit form by pressing `Enter`*/
});

if 문에 enter 키를 눌렀을 때만 두 명령문을 모두 실행하는 중괄호가 없어야합니까? 그렇지 않으면 키를 누를 때마다 제출이 이루어집니다. goto 실패를 상기시킵니다. :)
danmiser

13

<button>기본적으로 요소 를 사용하는 곳 은 해당 버튼을 고려하므로 버튼 type="submit"을 정의하면 제출 버튼으로 type="button"간주하지 않습니다 <button>.


2

양식의 텍스트 필드에서 Enter를 누르면 기본적으로 양식이 제출됩니다. 그런 식으로 작동하지 않으려면 enter 키를 눌러 캡처 한 것처럼 소비해야합니다. 이 문제를 해결할 방법이 없습니다. 양식에 버튼이 없어도이 방법으로 작동합니다.


4
문제는 양식이 제출한다는 것이 아니라고 생각합니다 click. 버튼 요소에 대한 조치가 의도하지 않은 결과를 촉발한다는 것입니다
Martin Jespersen

당신이 올바른지. 어느 쪽이든 결과는 동일합니다. 원하지 않는 양식 제출을 방지하려면 Enter 키를 캡처해야합니다.
Sparafusile 2016 년

2

적절한 시간까지 자바 스크립트를 사용하여 양식 제출을 차단할 수 있습니다. 매우 조잡한 예 :

<form onsubmit='return false;' id='frmNoEnterSubmit' action="index.html">

    <input type='text' name='txtTest' />

    <input type='button' value='Submit' 
        onclick='document.forms["frmNoEnterSubmit"].onsubmit=""; document.forms["frmNoEnterSubmit"].submit();' />

</form>

Enter 키를 누르면 제출 양식이 트리거되지만 실제로 JavaScript는 버튼을 실제로 누를 때까지 실제로 제출하지 못하게합니다.


2

돔 예

  <button onclick="anotherFoo()"> Add new row</button>
  <input type="text" name="xxx" onclick="foo(event)">

자바 스크립트

function foo(event){
   if(event.which == 13 || event.keyCode == 13) // for crossbrowser
   {
     event.preventDefault(); // this code prevents other buttons triggers use this
     // do stuff
   }
}

function anotherFoo(){
  // stuffs.
}

preventDefault ()를 사용하지 않으면 다른 버튼이 트리거됩니다.


0

버튼과 같은 onclick 이벤트 핸들러 (제출 안 됨)에서 이벤트 객체의 키 코드를 확인하십시오. "enter"이면 false를 반환합니다.


해당 키코 드는 클릭처럼 항상 전달됩니다. 거기에 문제가있다. :-)
Rob Wilkerson 2016 년

그런 다음 어려운 방법으로 버튼에서 onkeydown 이벤트를 처리하십시오. 핸들러에는 keyEvent가 전달됩니다. keyCode-> 13이면 preventDefault를 확인하십시오. 이렇게하면 실제로 클릭 이벤트를 실행하는 부작용없이 사용자가 해당 버튼에서 Enter를 누를 수 있습니다.
Satyajit

0

내 상황은 두 가지가 Submit폼 요소 내에서 버튼 : UpdateDelete. Delete버튼은 이미지와를 삭제Update 버튼 형태의 텍스트 필드에 데이터베이스를 업데이트합니다.

Delete단추가 양식의 첫 번째 이므로 Enter키 의 기본 단추였습니다 . 내가 원하는 것이 아닙니다. 사용자는 칠 수있을 것으로 예상합니다Enter 일부 텍스트 필드를 변경 한 후 있습니다.

기본 버튼 설정에 대한 답변을 여기 에서 찾았 습니다 .

<form action="/action_page.php" method="get" id="form1">
  First name: <input type="text" name="fname"><br>
  Last name: <input type="text" name="lname"><br>
</form>
<button type="submit" form="form1" value="Submit">Submit</button>

스크립트를 사용하지 않고 <button> form="bla"속성 을 사용하여 각 버튼이 속하는 양식을 정의했습니다 . 내가 설정 한 Delete존재와 설정하지 않습니다 폼에 버튼을 Update난에 트리거 원 버튼 Enter사용자가 텍스트를 입력 할 때에있을 것이라고 폼에 키를 누릅니다.

이것은 지금까지 나를 위해 일한 유일한 것입니다.



0

이런 식으로 할 수 있습니다.

이벤트를 공통 기능에 바인딩하고 키 누르기 또는 버튼 클릭으로 이벤트를 호출하십시오.

예를 들어.

function callME(event){
    alert('Hi');
}



$('button').on("click",callME); 
$('input ').keypress(function(event){
  if (event.which == 13) {
    callME(event);
  }
});

-1

양식의 첫 번째 요소로 "submit"유형의 버튼을 추가하고 보이지 않게했습니다 ( width:0;height:0;padding:0;margin:0;border-style:none;font-size:0;). 사이트를 새로 고치는 것처럼 작동합니다. 즉, 사이트를 다시로드하는 것 외에는 버튼을 누를 때 아무 작업도 수행하지 않습니다. 나를 위해 잘 작동합니다 ...

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