입력 유형 = "텍스트"에서 입력시 변경 사항을 추적하는 가장 좋은 방법은 무엇입니까?


449

내 경험상 input type="text" onchange이벤트는 일반적으로 blur컨트롤 을 떠난 후에 만 ​​발생합니다 .

컨텐츠가 변경 onchange될 때마다 브라우저가 강제로 트리거되도록하는 방법이 textfield있습니까? 그렇지 않다면 이것을“수동으로”추적하는 가장 우아한 방법은 무엇입니까?

onkey*필드를 마우스 오른쪽 단추로 클릭하고 붙여 넣기를 선택하면 키보드 입력없이 필드가 변경되므로 이벤트 사용 이 신뢰할 수 없습니다.

setTimeout유일한 방법은? .. 미운 :-)


@ 오래된 답변이 맨 위에 고정되지 않도록 승인 된 답변을 업데이트 할 가능성이 있습니까?
Flimm

답변:


271

최신 정보:

다른 답변 (2015)을 참조하십시오 .


원래 2009 답변 :

그렇다면 키 다운, onchange블러 붙여 넣기시 이벤트를 시작 하시겠습니까? 마술이다.

입력 할 때 변경 사항을 추적하려면을 사용하십시오 "onkeydown". 마우스로 붙여 넣기 작업을 트래핑해야하는 경우 "onpaste"( IE , FF3 ) 및 "oninput"( FF, Opera, Chrome, Safari 1 )을 사용하십시오.

1 Safari에서 고장 <textarea>났습니다. 사용 textInput하는 대신


22
onkeypress대신에 사용해야합니다 onkeydown. onkeydown키를 클릭하면 발생합니다. 사용자가 키를 누르고 있으면 첫 번째 문자에 대해 이벤트가 한 번만 발생합니다. onkeypress텍스트 필드에 문자가 추가 될 때마다 발생합니다.
fent

61
onchange모든 행동에 불을 피우는 것은 마술이 아닙니다 . <input onchange="doSomething();" onkeypress="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();">대부분을 위해 충분히 잘할 것입니다.
aroth

1
마우스를 사용하여 입력 상자에서 일부 텍스트를 삭제하는 것은 어떻습니까? 나는 이것이 효과가 없을 것이라고 생각한다.
Jeevan

47
jquery 1.8.3의 경우 다음과 같습니다.$().on('change keydown paste input', function() {})
Narfanator

4
@AriWais : 예, SO의 대부분은 더 이상 사용되지 않습니다. 이 답변은 8 살 입니다. 이 답변과 같은 오래된 답변에 대해 "사용 중단"버튼이 있었으면 좋겠다. 커뮤니티는 더 나은 답변을 선택할 수 있습니다.
Crescent Fresh

658

요즘 들어요 oninput. onchange요소에 초점을 잃을 필요없이 느낌이 듭니다 . HTML5입니다.

IE8 이하를 제외한 모든 사람 (모바일조차)이 지원합니다. IE의 경우 추가하십시오 onpropertychange. 나는 이것을 다음과 같이 사용한다 :

const source = document.getElementById('source');
const result = document.getElementById('result');

const inputHandler = function(e) {
  result.innerHTML = e.target.value;
}

source.addEventListener('input', inputHandler);
source.addEventListener('propertychange', inputHandler); // for IE8
// Firefox/Edge18-/IE9+ don’t fire on <select><option>
// source.addEventListener('change', inputHandler); 
<input id="source">
<div id="result"></div>


63
웹 표준과 같이 끊임없이 변화하는 세상에서 때때로 받아 들여진 대답은 몇 년 후에 바뀔 수 있습니다. 이것은 새로운 대답입니다.
Erick Petrucelli 2016

1
oninputIE9에서도 지원 은 부분적입니다 ( caniuse.com/#feat=input-event ).
Kenston Choi

마크 업이 렌더링되지 않도록 innerText대신 사용 하는 것이 좋습니다.innerHTML
Jeevan Takhar

47

아래 코드는 Jquery 1.8.3에서 잘 작동합니다.

HTML : <input type="text" id="myId" />

자바 스크립트 / JQuery :

$("#myId").on('change keydown paste input', function(){
      doSomething();
});

11
jQuery 라이브러리 에는 질문에 태그가 없습니다.
John Weisz

21
Jquery는 자바 스크립트 API이며, Jquery 키워드로 검색하면 여기에 Jquery 답변에 대한 각 자바 스크립트 질문에 대해 새 질문을 작성할 가치가 없다고 생각합니다 ...
GaelDev

12
사람들이 답변에 도서관 사용을 제안 할 수
없다면

3
여러 번 발사합니다. 변경 및 키 다운으로 인한 것 같습니다. 가능한 입력은 여기에서만 필요합니다.
mmm

1
keydown입력 값을 복제하고 제거하므로 필요하지 않습니다 .
Youssef Al Subaihi

43

자바 스크립트는 여기서 예측할 수없고 재미 있습니다.

  • onchange 텍스트 상자를 흐리게 할 때만 발생
  • onkeyup& onkeypress항상 텍스트의 변화가 발생하지 않습니다
  • onkeydown 텍스트 변경시 발생하지만 마우스 클릭으로 잘라 내기 및 붙여 넣기를 추적 할 수 없음
  • onpaste& oncut키를 누르거나 마우스 오른쪽 버튼을 클릭해도 발생합니다.

그래서, 텍스트 상자의 변화를 추적하기 위해, 우리는 필요 onkeydown, oncutonpaste. 이 이벤트의 콜백에서 텍스트 상자의 값을 확인하면 콜백 후에 값이 변경되어 업데이트 된 값을 얻지 못합니다. 따라서 이에 대한 해결책은 변경을 추적하기 위해 50 밀리 초 (또는 그 이하)의 시간 초과로 시간 초과 기능을 설정하는 것입니다.

이것은 더러운 해킹이지만 이것이 조사한 유일한 방법입니다.

다음은 예입니다. http://jsfiddle.net/2BfGC/12/


4
oninput그리고 textInput그 모든 브라우저에서 지원되지 않는,이에 대한 실제 솔루션이지만 이벤트입니다.
Sanket Sahu

두 번째 글 머리를 들어 당신이 의미 가정 onkeyuponkeydown유사있는. 둘 다 Ctrl, Alt, Shift 및 Meta 키를 캡처 할 수 있습니다. 세 번째 글 머리 기호의 의미는 다음과 같습니다 onkeypress.
다니엘 스티븐스

12

onkeyup예를 들어 입력 한 후 발생 t합니다. 손가락을 들어 올리면 눌립니다. 동작이 발생하지만 keydown문자를 숫자 화하기 전에 동작이 발생합니다.t

이것이 누군가에게 도움이되기를 바랍니다.

그래서 onkeyup더 나은 당신이 지금 입력 한 내용 보낼 때입니다.


8

비슷한 요구 사항이 있습니다 (twitter 스타일 텍스트 필드). 사용 onkeyuponchange. onchange실제로 현장에서 초점을 잃은 동안 마우스 붙여 넣기 작업을 처리합니다.

[업데이트] HTML5 이상 oninput에서 위의 다른 답변에 설명 된대로 실시간 문자 수정 업데이트를 얻는 데 사용하십시오 .


oninput은 textarea, input : text, input : password 또는 input : search 요소의 내용이 변경된시기를 감지하려는 경우 유용합니다. 수정 후 즉시가 아니라 요소가 포커스를 잃을 때 이러한 요소의 onchange 이벤트가 시작되기 때문입니다. .
hkasera

@hkasera 네, HTML5 oninput를 사용하는 것이 좋습니다. 그러나 구현했을 때 HTML5가 존재하지 않고 IE 8이있었습니다. (. 사용자에게 최신 정보를 제공하는 업데이트에 감사드립니다.
Mohnish


7

Internet Explorer 만 사용하는 경우 다음을 사용할 수 있습니다.

<input type="text" id="myID" onpropertychange="TextChange(this)" />

<script type="text/javascript">
    function TextChange(tBox) {
        if(event.propertyName=='value') {
            //your code here
        }
    }
</script>

희망이 도움이됩니다.


8
... 제 생각 엔 사내 프로젝트가 될 수 없습니다 :)
eselk

94
그 집에 살지 않아서 신께 감사드립니다! : D
Marco Matarazzi

13
10 년 전이 문장에는 아무 재미도 없을 것입니다 .. :(
Michał Tabor

4
나를 위해 이것이 도움이됩니다 .IE가 유일한 브라우저 인 임베디드 OS가있는 일부 모바일 프로젝트를 개발 중입니다.
Anders M.

3
Internet Explorer-LOL 만 사용하는 경우 2016 년에 하루를 보냈습니다!
Jack Black

4

거의 모든 해결책이 있지만 (모든 붙여 넣기 방법을 수정하지는 마십시오) 대부분은 다음과 같습니다.

텍스트 영역뿐만 아니라 입력에서도 작동합니다.

<input type="text" ... >
<textarea ... >...</textarea>

이렇게하세요 :

<input type="text" ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >
<textarea ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >...</textarea>

내가 말했듯이 모든 브라우저에서 이벤트를 붙여 넣는 모든 방법은 아니지만 최악의 이벤트는 전혀 발생하지 않지만 타이머는 사용하기가 끔찍합니다.

그러나 대부분의 붙여 넣기 방법은 키보드 및 / 또는 마우스로 수행되므로 일반적으로 붙여 넣기 후에 onkeyup 또는 onmouseup이 시작되고 키보드로 입력하면 onkeyup이 실행됩니다.

검사 코드가 시간이 많이 걸리지 않도록하십시오. 그렇지 않으면 사용자가 열악한 액세스를 얻습니다.

그렇습니다. 비결은 열쇠와 마우스를 발사하는 것입니다.


4

JQuery를 사용하여 다음 접근 방식을 판단하십시오.

HTML :

<input type="text" id="inputId" />

자바 스크립트 (JQuery) :

$("#inputId").keyup(function(){
        $("#inputId").blur();
        $("#inputId").focus();
});

$("#inputId").change(function(){
        //do whatever you need to do on actual change of the value of the input field
});

나는 같은 방식을 사용합니다
:)

이것이 최신 답변이 아니라는 것을 알고 있지만 모든 키 업에서 입력을 흐리게하고 초점을 다시 맞추지 않으면 입력의 끝을 제외한 다른 위치에 커서 위치가 생길 수 있습니까?
Michael Martin-Smucker

@ MichaelMartin-Smucker 당신은 그렇게 생각할 것입니다. 그러나 분명히 그렇지는 않습니다 : jsfiddle.net/gsss8c6L
Clonkex

4

"입력"이 나를 위해 일했습니다.

var searchBar  = document.getElementById("searchBar");
searchBar.addEventListener("input", PredictSearch, false);

3

당신은 사용할 수 있습니다 keydown, keyup그리고 keypress뿐만 아니라 이벤트를.


3

각각을 추적하려면이 예제를 시도하고 그 전에 커서 깜박임 속도를 0으로 완전히 줄이십시오.

<body>
//try onkeydown,onkeyup,onkeypress
<input type="text" onkeypress="myFunction(this.value)">
<span> </span>
<script>
function myFunction(val) {
//alert(val);
var mySpan = document.getElementsByTagName("span")[0].innerHTML;
mySpan += val+"<br>";
document.getElementsByTagName("span")[0].innerHTML = mySpan;
}
</script>

</body>

onblur : 종료시 이벤트 생성

onchange : 입력 텍스트에서 변경 한 경우 종료시 이벤트가 생성됩니다.

onkeydown : 키를 누를 때마다 이벤트가 생성됩니다 (키를 길게 누르고있는 경우에도)

onkeyup : 모든 키 릴리스에서 이벤트가 생성됩니다

onkeypress : onkeydown (또는 onkeyup)과 동일하지만 ctrl, backsace, alt에 대해서는 반응하지 않습니다.


1

2018 년 여기에 내가하는 일이 있습니다.

$(inputs).on('change keydown paste input propertychange click keyup blur',handler);

이 접근법에서 결함을 지적 할 수 있다면 감사하겠습니다.


2
2019 여기에 있으며 키를 누를 때마다 여러 번 실행됩니다. 예를 들어 여기를 참조하십시오 : jsfiddle.net/sp00n82/3r4691tq/5
sp00n

1

방법 1 : 에 대한 이벤트 리스너를 추가합니다 input:

element.addEventListener("input", myFunction);

 

방법 2 :oninput JavaScript를 사용 하여 속성 정의

element.oninput = function()
{
    myFunction();
};

 

방법 3 :oninput HTML을 사용 하여 속성 정의

<input type="text" oninput="myFunction();">

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