변경된 입력 텍스트 상자 감지


289

다른 많은 질문을 살펴본 결과 아래 코드를 포함하여 매우 간단한 답변을 찾았습니다. 누군가 텍스트 상자의 내용을 변경할 때 감지하고 싶지만 어떤 이유로 든 작동하지 않습니다 ... 콘솔 오류가 발생하지 않습니다. 브라우저에서 change()함수 의 중단 점을 설정 하면 절대로 충돌하지 않습니다.

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">

1
시도해야 할 몇 가지 : 입력에 type = "text"를 지정하고 단일 요소로 만듭니다. <input id = "inputDatabaseName"type = "text"/>
szeliga

불과 7 년 만에 불필요한 코드를 정리했습니다.
악마의 옹호자

답변:


523

다음 과 같이 jQuery 에서 inputJavascript 이벤트 를 사용할 수 있습니다 .

$('#inputDatabaseName').on('input',function(e){
    alert('Changed!')
});

순수한 JavaScript에서 :

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

또는 이렇게 :

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>

1
이 이벤트에 대한 문서를 찾을 수 없지만 예상 한대로 작동합니다. 문서 페이지를 어디에서 찾을 수 있습니까?
Jorge Pedret

3
HTML5 이벤트 목록에서 찾을 수 있습니다 : w3schools.com/tags/ref_eventattributes.asp 또는 여기 help.dottoro.com/ljhxklln.php
Ouadie

7
이 솔루션은 실제로 키업을 사용하는 것보다 훨씬 낫습니다. 예를 들어 IE는 키업을 트리거하지 않는 X를 클릭하여 입력 필드를 지울 수 있습니다.
Georg

7
지금까지 가장 가까운 솔루션이지만 브라우저가 텍스트 상자에서 자동 완성을 수행 할 때 여전히 작동하지 않습니다.
Saumil

3
이것은 첫 번째 대답보다 훨씬 낫습니다. Ctrl, Shift 키는 모두 키업으로 계산됩니다. 그리고 최악의 부분은 빠르게 입력하면 여러 입력이 하나의 키업 이벤트로만 등록된다는 것입니다.
octref

174

변경 대신 키업을 시도하십시오.

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

다음 은 .keyup () 공식 jQuery 설명서입니다 .


1
한숨을 쉰다. (이 질문을 본 후 : stackoverflow.com/questions/1443292/… ) ...하지만 분명히 지금 작동하지 않기 때문에!
악마의 옹호자

27
요소의 포커스가 풀리고 키보드의 키에서 손을 떼면 키업이 시작됩니다.
Declan Cook

9
사용자가 ctrl + v를 사용하거나 선택한 텍스트를 마우스로 #inputDatabaseName으로 드래그하여 코드를 붙여 넣으면 어떻게 되나요? 어떻게 감지합니까?
Radu Simionescu

5
이것의 주요 문제는 내용이 실제로 변경되는 경우 여전히 고려하지 않는다는 것입니다. 버튼 만 눌림
Metropolis

@ 메트로 폴리스, 당신은 내 대답을 보았다? stackoverflow.com/a/23266812/3160597
azerafati

103

각 답변에는 몇 가지 요점이 없으므로 여기 내 해결책이 있습니다.

$("#input").on("input", function(e) {
  var input = $(this);
  var val = input.val();

  if (input.data("lastval") != val) {
    input.data("lastval", val);

    //your change action goes here 
    console.log(val);
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">
<p>Try to drag the letters and copy paste</p>

Input Event에 화재 키보드 입력, 마우스 드래그 , 자동 채우기복사 - 붙여 넣기 크롬과 파이어 폭스에서 테스트. 이전 값을 확인하면 실제 변경 사항을 감지하여 동일한 것을 붙여 넣거나 동일한 문자 등을 입력 할 때 발생하지 않습니다.

실례 : http://jsfiddle.net/g6pcp/473/


최신 정보:

change function 사용자가 입력을 마치고 변경 작업을 여러 번 실행하지 못하게 할 때만 실행 하려면 다음을 시도하십시오.

var timerid;
$("#input").on("input", function(e) {
  var value = $(this).val();
  if ($(this).data("lastval") != value) {

    $(this).data("lastval", value);
    clearTimeout(timerid);

    timerid = setTimeout(function() {
      //your change action goes here 
      console.log(value);
    }, 500);
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">

사용자가 입력을 시작하면 (예 : "foobar")이 코드는 change action모든 문자 사용자 유형에 대해 실행을 방지 하고 사용자가 입력을 중지 할 때만 실행됩니다. 이는 입력을 서버로 보낼 때 특히 유용합니다 (예 : 검색 입력). 웨이 서버는 않는 단 하나의 검색 foobar이 아닌 육에 대한 검색 f후와 fofoofoob등등을.


1
이것은 내가 시도한 약 6에서 처음으로 작동했습니다. 대박. 감사.
Enkode

IE9에서 거의 작동합니다. 문자를 삭제하면 이벤트가 발생하지 않습니다. 아주 좋은 해결 방법
Soma

IE는 더 이상 계속되지는 않지만)하지만 당신은 그에 대한 수정이있는 경우 Google에 알려, 다른 사람들이 말하는 것처럼 @Soma는 "파괴 IE는 기능의 결함이 아니다"
azerafati

나도 알아,하지만 난 사실 일 :( 위해 그것을했다, 나는 수행을 사용 $("#input").focusout(function () {})하면 외부 입력을 클릭하면 이벤트가 발생되는 크롬과 파이어 폭스, 그리고 IE9의 현재 버전에서 작동합니다..
소마

2
@Soma, 이것이 IE가 작동하는 유일한 방법이라면이 줄을 바꾸는 것만으로 내 방식을 사용할 수 있습니다$("#input").on("input focusout",function(e){
azerafati

18

텍스트 입력은 change 포커스를 잃을 때까지 이벤트를 시작 . 입력 외부를 클릭하면 경고가 표시됩니다.

텍스트 입력이 포커스를 잃기 전에 콜백이 발생하면 .keyup()이벤트를 사용하십시오 .


change여기서 일하고 있습니다 : jsfiddle.net/g6pcp ; keyup좋은 방법이 아닌 각 키 이후 경고
diEcho

1
@diEcho 나는 경고가 코드를 작동시키는 예제 일뿐이라고 생각합니다. 결국 그가하려는 의도는 아닙니다.
Scott Harwell

@diEcho Scott이 말한 것은 테스트 목적입니다. 그것이 내가 디버깅하는 방법입니다 : D
Devil 's Advocate

@Scott보다는 적절한 디버거를 사용하십시오 alert(). 디버깅 이 훨씬 쉬워집니다.
매트 볼

13

onkeyup, onpaste, onchange, oninput브라우저가 텍스트 상자에서 자동 완성을 수행하면 실패한 것 같습니다. 이러한 경우를 처리하려면 "autocomplete='off' 브라우저가 텍스트 상자를 자동으로 채우지 못하도록 텍스트 필드에 "를 포함하십시오.

예 :

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>

3

필자의 경우 날짜 선택기에 첨부 된 텍스트 상자가있었습니다. 나를 위해 일한 유일한 해결책은 datepicker의 onSelect 이벤트 내에서 처리하는 것입니다.

<input type="text"  id="bookdate">

$("#bookdate").datepicker({            
     onSelect: function (selected) {
         //handle change event here
     }
});

0

나는 당신도 사용할 수 있다고 생각합니다 keydown:

$('#fieldID').on('keydown', function (e) {
  //console.log(e.which);
  if (e.which === 8) {
    //do something when pressing delete
    return true;
  } else {
    //do something else
    return false;
  }
});

-5

일:

$("#ContentPlaceHolder1_txtNombre").keyup(function () {
    var txt = $(this).val();
        $('.column').each(function () {
            $(this).show();
            if ($(this).text().toUpperCase().indexOf(txt.toUpperCase()) == -1) {
                $(this).hide();
            }
        });
    //}
});

그것은 다른 질문에 대한 코드처럼 보입니다 ... 값을 대문자로 표시하고 내용을 표시 / 숨기는 데있어 그 점은 무엇입니까?
Nico Haase
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.