onKeyPress 중에 입력 텍스트 상자의 텍스트를 얻는 방법은 무엇입니까?


85

사용자가 입력 할 때 텍스트 상자에 텍스트를 가져 오려고 합니다 ( jsfiddle 놀이터 ).

function edValueKeyPress() {
    var edValue = document.getElementById("edValue");
    var s = edValue.value;

    var lblValue = document.getElementById("lblValue");
    lblValue.innerText = "The text box contains: " + s;

    //var s = $("#edValue").val();
    //$("#lblValue").text(s);    
}
<input id="edValue" type="text" onKeyPress="edValueKeyPress()"><br>
<span id="lblValue">The text box contains: </span>

이 코드는 것을 제외하고, 오류없이 실행 input text동안, 상자 onKeyPress값 항상 전에 변화가 :

여기에 이미지 설명 입력

질문 : 텍스트 상자의 텍스트를 어떻게 얻 onKeyPress습니까?

보너스 채터

HTML DOM에는 "사용자가 입력 중" 과 관련된 세 가지 이벤트가 있습니다 .

  • onKeyDown
  • onKeyPress
  • onKeyUp

Windows 에서는 WM_Key사용자가 키를 누르고 있고 키가 반복되기 시작하면 메시지 순서 가 중요해집니다.

  • WM_KEYDOWN('a')-사용자가 A키를 눌렀습니다.
  • WM_CHAR('a')- a사용자로부터 캐릭터를 받았습니다.
  • WM_CHAR('a')- a사용자로부터 캐릭터를 받았습니다.
  • WM_CHAR('a')- a사용자로부터 캐릭터를 받았습니다.
  • WM_CHAR('a')- a사용자로부터 캐릭터를 받았습니다.
  • WM_CHAR('a')- a사용자로부터 캐릭터를 받았습니다.
  • WM_KEYUP('a')-사용자가 A키를 놓았습니다.

텍스트 컨트롤에 5 개의 문자가 나타납니다. aaaaa

중요한 점은 WM_CHAR메시지에 응답 하는 것, 반복 되는 메시지입니다. 그렇지 않으면 키를 누를 때 이벤트가 누락됩니다.

HTML 에서는 약간 다릅니다.

  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyUp

html로는 제공 KeyDown하고 KeyPress모든 키 반복합니다. 그리고 KeyUp이벤트는 사용자가 키를 놓을 때만 발생합니다.

테이크 아웃

  • 나는 에 응답 onKeyDown하거나 onKeyPress,하지만 전에 모두는 여전히 제기되는 input.value업데이트되었습니다
  • onKeyUp텍스트 상자의 텍스트가 변경 될 때 발생하지 않기 때문에에 응답 할 수 없습니다 .

질문 : 텍스트 상자의 텍스트를 어떻게 얻 onKeyPress습니까?

보너스 읽기


1
반환하기 전에 현재 키 누르기를 값에 추가해야한다고 생각합니다. 값은 keyUp에서 업데이트되지만 데이터는 keyDown에서 사용할 수 있습니다.
Mathletics

당신이 팽창 추가 할 않는 나를 위해 주요까지 작동, 당신은 이런 일에 대한 JQ 필요하지 않습니다
라이언 B

그것은 당신의 작업 만 onKeyUp에 충분하다
드미트로

@mit Only handling onKeyUp은 텍스트 상자에 변경 사항이 발생하는대로 표시하지 않습니다.
Ian Boyd

아무 키나 누른 채 텍스트 상자에 결과를 얻으려면 onKeyPress 및 onKeyDown 이벤트 Jonathan M의 fiddle을 모두 사용해야 하지만 키를 누르지 않고 결과를 얻으려면 onKeyUp my fiddle 만 충분합니다 .
드미트로

답변:


19

input이벤트 처리는 일관된 솔루션입니다. 모든 최신 브라우저에서 및 요소에 대해 지원 되며 필요할 때 정확히 실행 됩니다.textareainput

function edValueKeyPress() {
    var edValue = document.getElementById("edValue");
    var s = edValue.value;

    var lblValue = document.getElementById("lblValue");
    lblValue.innerText = "The text box contains: " + s;
}
<input id="edValue" type="text" onInput="edValueKeyPress()"><br>
<span id="lblValue">The text box contains: </span>

그래도 조금 다시 작성하겠습니다.

function showCurrentValue(event)
{
    const value = event.target.value;
    document.getElementById("lblValue").innerText = value;
}
<input id="edValue" type="text" onInput="showCurrentValue(event)"><br>
The text box contains: <span id="lblValue"></span>


54

단순하게 유지하십시오. onKeyPress()및 모두 사용 onKeyUp():

<input id="edValue" type="text" onKeyPress="edValueKeyPress()" onKeyUp="edValueKeyPress()">

이렇게하면 가장 많이 업데이트 된 문자열 값 (키를 올린 후)을 가져오고 사용자가 키를 누르고 있으면 업데이트됩니다.

jsfiddle : http://jsfiddle.net/VDd6C/8/


arnaud576875의 답변은 포기하고 onKeyUp(사용 목적을 무력화) 대체해야했기 때문에 onKeypress이것은 누구나 볼 수있는 가장 간단하고 깨끗하며 가장 가까운 답변입니다. 가장 신중하게 관찰하는 사용자 만이 입력 한 피드백과 일치하지 않음을 알 수 있습니다.
Ian Boyd

@Ian, 기꺼이 도와주세요. "의견이 입력 한 내용과 일치하지 않음"이란 무엇을 의미합니까? 조정이 필요합니까?
Jonathan M

나는 지금 내가 의미했던 것을 기억한다! 내가 언급하는 피드백은 <input>요소를 빨간색 또는 녹색 으로 채색 하거나 사용자가 입력 한 내용이 좋거나 나쁘다는 다른 피드백을 사용자에게 제공하는 것입니다. 당신의 허용 대답은 여전히 항상 존재의 문제를 앓고 있지만 "오프 -로 - 하나" : 문자 는 가장 관찰력이 사용자가 피드백을 알들이 입력 한 내용과 일치하지 않습니다. " 오프 부산물 때문에, 실제로 하나의 오류는 (나 외에) 키 반복 (그들은 키 아래로 잡고있어 즉) 아무도 중에 발생하는 문제를 발견 할 것이다.
이안 보이드

19

onKeyPress 동안 입력 텍스트 상자의 값은 항상 변경 전의 값입니다.

이것은 의도적 인 것입니다. 이벤트 리스너가 키 누르기를 취소 할 수 있도록합니다.

이벤트 리스너가 이벤트를 취소 하면 값이 업데이트되지 않습니다. 이벤트가 취소되지 않은 경우 값이 업데이트되지만 이벤트 리스너가 호출 된 후 입니다.

필드 값이 업데이트 된 후 값을 얻으려면 다음 이벤트 루프에서 실행할 함수를 예약하십시오. 이를 수행하는 일반적인 방법은 다음 setTimeout과 같은 시간 초과 로 호출 하는 것입니다 0.

$('#field').keyup(function() {
    var $field = $(this);

    // this is the value before the keypress
    var beforeVal = $field.val();

    setTimeout(function() {

        // this is the value after the keypress
        var afterVal = $field.val();
    }, 0);
});

여기에서 시도하십시오 : http://jsfiddle.net/Q57gY/2/

편집 : 일부 브라우저 (예 : Chrome)는 백 스페이스에 대한 키 누르기 이벤트를 트리거하지 않습니다. 코드에서 keypress를 keyup으로 변경했습니다.


이것을 게시하려고했습니다. 다음은 내가 한 jsFiddle 입니다.
kapa

맞습니다. Chrome은 백 스페이스에 대한 키 누르기 이벤트를 트리거하지 않는 것 같습니다. 업데이트
아르노 르 블랑

@Ian, OP가 키를 누른 상태에서 업데이트를 원합니까? 이것이 요구 사항인지 너무 확실하지 않았습니다. 하지만이 솔루션에는 해당 기능이 없습니다.
Jonathan M

명확하게하기 : 백 스페이스에 대한 키 누르기 이벤트를 트리거하지 않는 것은 표준에 따른 것입니다 : "문자 값을 생성하는 키"-다른 키의 경우 "키 다운"(변경 전, 취소 가능) 또는 "
키업

5

컴팩트하게 유지하십시오.
키를 누를 때마다 함수 edValueKeyPress()가 호출됩니다.
또한 해당 함수에서 일부 변수를 선언하고 초기화했습니다. 이로 인해 프로세스 속도가 느려지고 CPU와 메모리도 더 많이 필요합니다.
간단한 대체에서 파생 된이 코드를 간단히 사용할 수 있습니다.

function edValueKeyPress()
{
    document.getElementById("lblValue").innerText =""+document.getElementById("edValue").value;
}

그게 당신이 원하는 전부이며 더 빠릅니다!


3
<asp:TextBox ID="txtMobile" runat="server" CssClass="form-control" style="width:92%;  margin:0px 5px 0px 5px;" onkeypress="javascript:return isNumberKey(event);" MaxLength="12"></asp:TextBox>

<script>
    function isNumberKey(evt) {
        var charCode = (evt.which) ? evt.which : event.keyCode;
        if (charCode > 31 && (charCode < 48 || charCode > 57)) {
            return false;
        }
        return true;
    }
</script>

3

지금까지 완전한 솔루션을 제공하는 답변은 없습니다. 해결해야 할 몇 가지 문제가 있습니다.

  1. 모든 키 누름이에 전달되지 않음 keydownkeypress 핸들러 (예 : 백 스페이스 및 삭제 키는 일부 브라우저에서 억제됨).
  2. 손질 keydown 은 좋은 생각이 아닙니다. keydown으로 인해 keypress가 발생하지 않는 상황이 있습니다!
  3. setTimeout() 스타일 솔루션은 사용자가 입력을 중지 할 때까지 Chrome / Blink 웹 브라우저에서 지연됩니다.
  4. 마우스 및 터치 이벤트를 사용하여 잘라 내기, 복사 및 붙여 넣기와 같은 작업을 수행 할 수 있습니다. 이러한 이벤트는 키보드 이벤트를 트리거하지 않습니다.
  5. 입력 방법에 따라 브라우저는 사용자가 필드를 벗어날 때까지 요소가 변경되었다는 알림을 전달하지 않을 수 있습니다.

더 정확한 해결책은 처리 할 keypress, keyup, input, 및 change이벤트를.

예:

<p><input id="editvalue" type="text"></p>
<p>The text box contains: <span id="labelvalue"></span></p>

<script>
function UpdateDisplay()
{
    var inputelem = document.getElementById("editvalue");
    var s = inputelem.value;

    var labelelem = document.getElementById("labelvalue");
    labelelem.innerText = s;
}

// Initial update.
UpdateDisplay();

// Register event handlers.
var inputelem = document.getElementById("editvalue");
inputelem.addEventListener('keypress', UpdateDisplay);
inputelem.addEventListener('keyup', UpdateDisplay);
inputelem.addEventListener('input', UpdateDisplay);
inputelem.addEventListener('change', UpdateDisplay);
</script>

깡깡이:

http://jsfiddle.net/VDd6C/2175/

네 가지 이벤트를 모두 처리하면 모든 엣지 케이스를 포착합니다. 사용자의 입력으로 작업 할 때 모든 유형의 입력 방법을 고려하고 브라우저 간 및 장치 간 기능을 확인해야합니다. 위 코드는 내가 소유 한 모바일 장치뿐만 아니라 데스크톱의 Firefox, Edge 및 Chrome에서 테스트되었습니다.


왜 그냥 input이벤트가 아닌가?
YakovL

input항상 발사되는 것은 아닙니다. 모든 상황을 다루는 단일 이벤트는 없습니다.
CubicleSoft

당신이 "항상은 아님"에 대해 지정한 것처럼 더 자세하게 설명하면 좋을 것입니다. keypress대답에서
좋을

1

나는 일반적으로 필드의 값 (즉, 업데이트되기 전)을 키 이벤트와 관련된 키와 연결합니다. 다음은 최신 JS를 사용하므로 이전 IE의 지원을 조정해야합니다.

최근 JS 예

document.querySelector('#test').addEventListener('keypress', function(evt) {
    var real_val = this.value + String.fromCharCode(evt.which);
    if (evt.which == 8) real_val = real_val.substr(0, real_val.length - 2);
    alert(real_val);
}, false);

이전 IE 지원 예

//get field
var field = document.getElementById('test');

//bind, somehow
if (window.addEventListener)
    field.addEventListener('keypress', keypress_cb, false);
else
    field.attachEvent('onkeypress', keypress_cb);

//callback
function keypress_cb(evt) {
    evt = evt || window.event;
    var code = evt.which || evt.keyCode,
        real_val = this.value + String.fromCharCode(code);
    if (code == 8) real_val = real_val.substr(0, real_val.length - 2);
}

[편집-이 방법은 기본적으로 백 스페이스, CTRL + A와 같은 키 누름을 비활성화합니다. 위의 코드는 전자를 수용하지만 후자와 몇 가지 다른 결과를 허용하기 위해 추가 수정이 필요합니다. 아래 Ian Boyd의 의견을 참조하십시오.]


1
@ bažmegakapa 또는 delete키를 사용하거나 사용자가 내용을 수정하지 않는 키 ( Ctrl+A)를 누르거나 사용자가 일부 텍스트를 선택한 다음을 눌러 a하위 집합을 바꿉니다. 좋은 생각이야, Utkanos,하지만 깨지기 쉬운 생각이야.
Ian Boyd

1
동의합니다. 약간의 마일리지가 있기 때문에 나는 그것을 남겨 둘 것이지만, 당신이 말했듯이, 당신은 이러한 경고에 대한 수당을 쌓아야 할 것입니다.
미샤

1

쉬운...

keyPress 이벤트 핸들러에서

void ValidateKeyPressHandler(object sender, KeyPressEventArgs e)
{
    var tb = sender as TextBox;
    var startPos = tb.SelectionStart;
    var selLen= tb.SelectionLength;

    var afterEditValue = tb.Text.Remove(startPos, selLen)
                .Insert(startPos, e.KeyChar.ToString()); 
    //  ... more here
}

하면 어떻게됩니까 e.KeyChar는 IS Backspace키가? 아니면 Delete열쇠? 아니면 Ctrl+A?
Ian Boyd

이게 JavaScript일까요? void? object? 첫 번째 대문자 방법?
YakovL

1

따라서 각 이벤트에는 장단점이 있습니다. 이벤트 onkeypressonkeydown최신 값을 검색하지 않습니다.onkeypress 일부 브라우저에서 인쇄 할 수없는 문자에 대한 화재하지 않습니다. 그만큼onkeyup키가 여러 문자를 누른 상태로있을 경우, 이벤트는 감지하지 않습니다.

이것은 약간 해키하지만 다음과 같은 작업을 수행합니다.

function edValueKeyDown(input) {
    var s = input.value;

    var lblValue = document.getElementById("lblValue");
    lblValue.innerText = "The text box contains: "+s;

    //var s = $("#edValue").val();
    //$("#lblValue").text(s);    
}
<input id="edValue" type="text" onkeydown="setTimeout(edValueKeyDown, 0, this)" />

모든 세계의 최고를 다루는 것 같습니다.


1

event.key 를 사용하여 HTML 입력 텍스트 상자에 입력하기 전에 값을 가져올 수 있습니다. 다음은 코드입니다.

function checkText()
{
  console.log("Value Entered which was prevented was - " + event.key);
  
  //Following will prevent displaying value on textbox
  //You need to use your validation functions here and return value true or false.
  return false;
}
<input type="text" placeholder="Enter Value" onkeypress="return checkText()" />


키를 누르지 않는 것 (잘라 내기, 붙여 넣기, 선택한 항목 삭제 등)을 통해 텍스트가 변경되면이 문제가 발생합니다.
Ian Boyd

@IanBoyd 네 동의했습니다. 예제를 간단하게 유지하기 위해 키 누르기 유효성 검사 만 구현했습니다.
vibs2006

0

이벤트 charCode를 얻은 값에 연결하십시오. 다음은 내 코드 샘플입니다.

<input type="text" name="price" onkeypress="return (cnum(event,this))" maxlength="10">
<p id="demo"></p>

js :

function cnum(event, str) {
    var a = event.charCode;
    var ab = str.value + String.fromCharCode(a);
    document.getElementById('demo').innerHTML = ab;
}

의 값 ab은 입력 필드의 최신 값을 가져옵니다.


죄송합니다.이 페이지를 게시 한 후이 페이지에서 더 나은 접근 방식을 가진 다른 게시물을 발견했습니다. 게시하기 전에는 보지 못했습니다. 그러나 나는 개념을 이해하는 것이 더 간단하다고 생각합니다.
Rama Krishna

키가 될 때 꽤 빨리 무너 삭제 , 백 스페이스 , Ctrl 키 + X 또는 Ctrl 키 + V를 , 또는 마우스가 모든 텍스트를 선택하면 내가 누르 우주
이안 보이드

방금 아이디어를 썼습니다. 키 코드 또는 기타 방법을 사용하여 요구 사항에 따라 구현할 수 있습니다. 이것은 단지 내 생각입니다.
Rama Krishna

1
아이디어는 답이 아닙니다. SO에 대한 답변은 모든 사람이 혜택을 누릴 수 있도록 OP의 질문에 확실하게 답변하는 간결한 솔루션이어야합니다. 이것은 분명히 그 기준을 충족하지 않습니다.
CubicleSoft

0

이를 수행하는 더 좋은 방법이 있습니다. concat 메소드를 사용하십시오. 예

전역 변수를 선언하십시오. 이것은 각도 10에서 잘 작동하며 Vanilla JavaScript에 전달하십시오. 예:

HTML

<input id="edValue" type="text" onKeyPress="edValueKeyPress($event)"><br>
<span id="lblValue">The text box contains: </span>

암호

emptyString = ''

edValueKeyPress ($event){
   this.emptyString = this.emptyString.concat($event.key);
   console.log(this.emptyString);
}

그리고 키가있을 때 Delete, Ctrl+ X, Ctrl+ V, Backspace? 또는 텍스트를 선택한 다음 A? 를 누릅니다 .
Ian Boyd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.