JavaScript로 키 프레스 이벤트를 입력하십시오


330

나는이 form두 개의 텍스트 상자, 하나 를 선택 드롭 다운 하나 개의 라디오 버튼을 . 때 enter키를 누르면, 내가 자바 스크립트 함수 (사용자 정의)를 호출 할,하지만 난 그것을 누르면 양식이 제출됩니다.

키를 누를 form때 제출이 되지 않도록하려면 어떻게합니까 enter?

답변:


445
if(characterCode == 13)
{
    return false; // returning false will prevent the event from bubbling up.
}
else
{
    return true;
}

자, 다음 텍스트 상자가 양식에 있다고 가정하십시오.

<input id="scriptBox" type="text" onkeypress="return runScript(event)" />

Enter 키를 눌렀을 때이 텍스트 상자에서 "사용자 정의"스크립트를 실행하고 양식을 제출하지 않으려면 샘플 코드가 있습니다. 이 기능은 오류 검사를 수행하지 않으며 대부분 IE에서만 작동합니다. 이를 위해서는보다 강력한 솔루션이 필요하지만 일반적인 아이디어를 얻을 수 있습니다.

function runScript(e) {
    //See notes about 'which' and 'key'
    if (e.keyCode == 13) {
        var tb = document.getElementById("scriptBox");
        eval(tb.value);
        return false;
    }
}

함수 값을 반환하면 이벤트 처리기가 이벤트를 더 이상 버블 링하지 않도록 경고하고 키 누르기 이벤트가 더 이상 처리되지 않도록합니다.

노트:

그것은 지적 밖으로이었다 keyCode되고 지금은 추천하지 않습니다 . 다음으로 가장 좋은 대안 which은 더 이상 사용되지 않습니다 .

불행히도 key최신 브라우저에서 널리 지원되는 표준 은 IE와 Edge에서 약간의 동작을 합니다. IE11보다 오래된 것은 여전히 polyfill이 필요합니다 .

또한, 더 이상 사용되지 않는 경고는 keyCode및 which에 대해 매우 불길하지만 ,이를 제거하면 수많은 레거시 웹 사이트가 크게 변경 될 수 있습니다. 이런 이유로 그들은 언제 어디서나 갈 것 같지 않습니다.


4
사용자 정의에 의해 정확히 무엇을 의미합니까? 마찬가지로 사용자는 텍스트 상자에 스크립트를 입력하고 Eval () ???
— Josh

1
PreventDefualt를 사용할 수있는 상황입니까?

12
@ Stuart.Sklinar-브라우저에 입력 한 사용자가 입력을 평가하면 Chrome / FF / IE에서 명령 콘솔을 열고 스크립트 자체에 입력 한 것보다 더 많은 제어 권한을 부여하지 않습니다. 그들이 당신을 해칠 수있는 유일한 사람은 서버 보안을 강화하지 않는 한 스스로입니다. 그것은 또 다른 문제입니다.
— Josh

1
@SteelBrain-다시 한 번, 누군가가 입력 할 수있는 텍스트 상자를 제공 한 다음 eval버튼을 눌렀을 때 의 내용은 개발자 도구를 열어서 만든 내용 과 다르지 않습니다. 이것이 DB에 저장되어 다른 사용자 가 열 수있는 것이면 큰 문제이지만이 작은 조각과는 완전히 독립적 인 문제입니다.
— Josh


137

event.which와 모두 사용 event.keyCode:

function (event) {
    if (event.which == 13 || event.keyCode == 13) {
        //code to execute here
        return false;
    }
    return true;
};

11
왜 event.which와 event.keyCode 둘 다?
— Alex Spurling

35
일부 브라우저는 which다른 브라우저를 지원 합니다 keyCode. 둘 다 포함하는 것이 좋습니다.
— user568109

또한 사용하는 keydown대신 이벤트 keyup또는keypress
— manish_s

@Agiagnoc 그러나 어떤 이벤트를 첨부해야합니까?
— 돈 Cheadle

2
@manish, keypress는 keydown / up보다 많은 정보를 제공합니다. stackoverflow.com/a/9905293/322537
— Hermann Ingjaldsson 2018 년

78

jQuery를 사용하는 경우 :

$('input[type=text]').on('keydown', function(e) {
    if (e.which == 13) {
        e.preventDefault();
    }
});

1
나는 이것을 작동시킬 수 없었다. 처리기는 실행되지만 preventDefaultChrome에서 적어도 양식 제출을 중단하지는 않습니다.
— Drew Noakes

19
$('input[type=text]').on('keydown', function(e) { if (e.which == 13) { e.preventDefault(); } });
— 키업

2
제출 후 keyup이 시작되어 취소 할 수 없습니다.
— Pierre-Olivier Vares

키 업과 키 누르기가 모두 나를 위해 일했습니다. 나는 키 누르기와 함께 갔다. 감사!
— markiyanm

'keydown'다른 의견자가 말한대로 맞습니다. 변경되지 않았으므로 답변을 업데이트합니다. 나는이 답변을 사용하고 돌아와서 의견을 볼 때까지 잠시 붙어있었습니다.
— Matt K

71

event.key === "입력"

가장 최근의 클리너 :을 사용하십시오 event.key. 더 이상 임의의 숫자 코드가 없습니다!

const node = document.getElementsByClassName(".mySelect")[0];
node.addEventListener("keydown", function(event) {
    if (event.key === "Enter") {
        event.preventDefault();
        // Do more work
    }
});

모질라 문서

지원되는 브라우저


이것을 찾고 있었다. 콘솔 로그에서 $ event의 키 속성을 보았습니다. 더 신뢰할 수 있다고 생각했습니다
— tatsu

이것은 단지 매크로 또는 별칭이 아닌가? 이 코드를 사용하면 성능면에서 어떤 이점이 있습니까?
— clockw0rk

1
keyCode더 이상 사용되지 않습니다. 이것은 코드에서 마술 정수보다 더 읽기 쉽고 유지 관리가 가능합니다
— Gibolt


17

onsubmit함수의 호출이되도록 양식 의 조치를 대체하고 그 뒤에 return false를 추가하십시오.

<form onsubmit="javascript:myfunc();return false;" >

이 페이지에 다른 양식이 제출되어 onsubmit을 무시할 수 없습니다
— Shyju

5
그래 넌 할수있어. 자바 스크립트는 프로토 타입 기반 언어입니다. document.forms [ "form_name"]. onsubmit = fucntion () {}
— the_drow

양식을 제출할 때 실행할 또 다른 삭제 절차가 있습니다. 따라서 그대로 유지하고 싶습니다.
— Shyju

17

반응 JS 솔루션

 handleChange: function(e) {
    if (e.key == 'Enter') {
      console.log('test');
    }


 <div>
    <Input type="text"
       ref = "input"
       placeholder="hiya"
       onKeyPress={this.handleChange}
    />
 </div>

9

따라서 가능한 많은 브라우저를 포괄하고 향후 증거가 될 수있는 최상의 솔루션 일 것입니다.

if (event.which === 13 || event.keyCode === 13 || event.key === "Enter")

6

순수하게 자바 스크립트를 사용하여하고 싶다면 완벽하게 작동하는 예제입니다.

이것이 html 파일이라고 가정 해 봅시다

<!DOCTYPE html>
<html>
  <body style="width: 500px">
    <input type="text" id="textSearch"/> 
      <script type="text/javascript" src="public/js/popup.js"></script>
  </body>
</html>

당신의 popup.js의 파일 만이 기능을 사용

var input = document.getElementById("textSearch");
input.addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        alert("yes it works,I'm happy ");
    }
});

5

아래 코드는 ENTER전체 페이지 에 키에 대한 리스너를 추가 합니다.

이것은 로그인, 등록, 제출 등과 같은 단일 동작 버튼이있는 화면에서 매우 유용 할 수 있습니다.

<head>
        <!--Import jQuery IMPORTANT -->
        <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>

         <!--Listen to Enter key event-->
        <script type="text/javascript">

            $(document).keypress(function (e) {
                if (e.which == 13 || event.keyCode == 13) {
                    alert('enter key is pressed');
                }
            });
        </script>
    </head>

모든 브라우저에서 테스트되었습니다.


3

jQuery 솔루션.

텍스트 입력에서 blur 이벤트가 시작될 때까지 양식 제출을 지연시킬 수있는 방법을 찾기 위해 여기에 왔습니다.

$(selector).keyup(function(e){
  /*
   * Delay the enter key form submit till after the hidden
   * input is updated.
   */

  // No need to do anything if it's not the enter key
  // Also only e.which is needed as this is the jQuery event object.
  if (e.which !== 13) {
       return;
  }

  // Prevent form submit
  e.preventDefault();

  // Trigger the blur event.
  this.blur();

  // Submit the form.
  $(e.target).closest('form').submit();
});

양식 제출이 아닌 지연된 모든 이벤트를 발생시키는 더 일반적인 버전을 얻는 것이 좋을 것입니다.


3

내 관점에서 훨씬 간단하고 효과적인 방법은 다음과 같습니다.

function onPress_ENTER()
{
        var keyPressed = event.keyCode || event.which;

        //if ENTER is pressed
        if(keyPressed==13)
        {
            alert('enter pressed');
            keyPressed=null;
        }
        else
        {
            return false;
        }
}

2

TypeScript를 사용하고 함수에서 다중 호출을 피하십시오.

let el1= <HTMLInputElement>document.getElementById('searchUser');
el1.onkeypress = SearchListEnter;

function SearchListEnter(event: KeyboardEvent) {
    if (event.which !== 13) {
        return;
    }
    // more stuff
}

이 질문은 8 세 이상입니다. 그 당시에는 타자기가 없었습니다. 다른 질문에 대답하지 않습니까?
— Nico Haase

2

조금 간단

"Press"키를 누를 때 양식을 보내지 마십시오.

<form id="form_cdb" onsubmit="return false">

"Enter"키를 눌러 기능을 실행하십시오.

<input type="text" autocomplete="off" onkeypress="if(event.key === 'Enter') my_event()">

1

기본 js (API 가져 오기)

document.onload = (() => {
    alert('ok');
    let keyListener = document.querySelector('#searchUser');
    // 
    keyListener.addEventListener('keypress', (e) => {
        if(e.keyCode === 13){
            let username = e.target.value;
            console.log(`username = ${username}`);
            fetch(`https://api.github.com/users/${username}`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((user)=>{
                console.log(`user = ${user}`);
            });
            fetch(`https://api.github.com/users/${username}/repos`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((repos)=>{
                console.log(`repos = ${repos}`);
                for (let i = 0; i < repos.length; i++) {
                     console.log(`repos ${i}  = ${repos[i]}`);
                }
            });
        }else{
            console.log(`e.keyCode = ${e.keyCode}`);
        }
    });
})();
<input _ngcontent-inf-0="" class="form-control" id="searchUser" placeholder="Github username..." type="text">


여기에 client_id 등이 포함 된 이유는 무엇입니까? 코드가 합법적입니까?
— eddyparkinson

1
<form id="form1" runat="server" onkeypress="return event.keyCode != 13;">

이 코드를 HTML 페이지에 추가하면 ... 입력 버튼이 비활성화됩니다.


0
<div class="nav-search" id="nav-search">
        <form class="form-search">
            <span class="input-icon">
                <input type="text" placeholder="Search ..." class="nav-search-input" id="search_value" autocomplete="off" />
                <i class="ace-icon fa fa-search nav-search-icon"></i>
            </span>
            <input type="button" id="search" value="Search" class="btn btn-xs" style="border-radius: 5px;">
        </form>

</div>

<script type="text/javascript">
    $("#search_value").on('keydown', function(e) {
        if (e.which == 13) {
             $("#search").trigger('click');
            return false;
        }
    });
    $("#search").on('click',function(){
        alert('You press enter');
    });
</script>

0

크로스 브라우저 솔루션

일부 구형 브라우저는 비표준 방식으로 키 다운 이벤트를 구현했습니다.

KeyBoardEvent.key 는 최신 브라우저에서 구현되는 방식입니다.

which 그리고 keyCode현재 사용되지 않습니다,하지만 그럼에도 불구하고 이렇게 코드가 여전히 IE와 같은 오래된 브라우저를 사용하는 사용자를 위해 작동하는 이러한 이벤트를 확인하기 위해 다치게하지 않습니다.

이 isKeyPressed기능은 누른 키가 입력되었는지 확인 event.preventDefault()하여 양식 제출을 방해합니다.

  if (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }

최소 작업 예

JS

function isKeyPressed(event, expectedKey, expectedCode) {
  const code = event.which || event.keyCode;

  if (expectedKey === event.key || code === expectedCode) {
    return true;
  }
  return false;
}

document.getElementById('myInput').addEventListener('keydown', function(event) {
  if (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }
});

HTML

<form>
  <input id="myInput">
</form>

https://jsfiddle.net/tobiobeck/z13dh5r2/

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