텍스트 상자가 포커스를 잃을 때까지 jQuery 텍스트 상자 변경 이벤트가 발생하지 않습니까?


133

텍스트 상자 외부에서 클릭 할 때까지 텍스트 상자의 jQuery 변경 이벤트가 시작되지 않는다는 것을 알았습니다.

HTML :

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

JS :

$("#textbox").change(function() {alert("Change detected!");});

JSFiddle 데모 보기

내 응용 프로그램은 텍스트 상자의 모든 문자 변경시 이벤트를 시작해야합니다. 대신 키업을 사용해 보았습니다 ...

$("#textbox").keyup(function() {alert("Keyup detected!");});

... 키업 이벤트가 마우스 오른쪽 버튼으로 클릭하여 붙여 넣기로 시작되지 않는다는 것은 알려진 사실입니다.

해결 방법이 있습니까? 두 청취자 모두에게 문제가 있습니까?


^^ 이것. 원하는만큼 이벤트 핸들러를 가질 수 있습니다.
복원 Monica Monica Cellio

답변:


298

두 가지 이벤트에 바인딩하는 것이 일반적인 방법입니다. 붙여 넣기 이벤트에 바인딩 할 수도 있습니다.

다음과 같이 여러 이벤트에 바인딩 할 수 있습니다.

$("#textbox").on('change keyup paste', function() {
    console.log('I am pretty sure the text box changed');
});

당신이 그것에 대해 pedantic하고 싶다면, 당신은 또한 텍스트를 드래그하기 위해 마우스 업에 바인딩 lastValue하고 텍스트가 실제로 변경되었는지 확인 하는 변수를 추가 해야합니다 :

var lastValue = '';
$("#textbox").on('change keyup paste mouseup', function() {
    if ($(this).val() != lastValue) {
        lastValue = $(this).val();
        console.log('The text box really changed this time');
    }
});

그리고 super duperpedantic 하고 싶다면 자동 채우기, 플러그인 등을 제공하기 위해 간격 타이머를 사용해야합니다.

var lastValue = '';
setInterval(function() {
    if ($("#textbox").val() != lastValue) {
        lastValue = $("#textbox").val();
        console.log('I am definitely sure the text box realy realy changed this time');
    }
}, 500);

9
마침내 누군가가 질문을 읽고 모든 것에 대답했습니다!
복원 Monica Monica Cellio 2016 년

4
.on('change keyup paste', function() {...}실제로 여러 번 발생합니다! 문자를 입력 한 다음 외부를 클릭하면 'change'및 'keyup'이벤트가 모두 발생하여 기능이 여러 번 실행됩니다! 마우스 오른쪽 버튼을 클릭하여 붙여 넣은 다음 외부를 클릭하면 '변경'과 '붙여 넣기'가 모두 실행됩니다. 도대체! Ctrl + V를 사용하여 붙여 넣은 다음 외부를 클릭하면 세 번 발사됩니다!
SNag

1
@SNag 예, 마찬가지로 lastValue변수를 사용하여 실제로 변경되었는지 확인해야합니다.
Petah

1
+1. 그러나 여기서도 '변화'에 구속력이 있는가? (변경) 해고 당했을 때 아직 처리되지 않은 사례를 명확하게 알 수 없습니다.
Madbreaks

1
텍스트를 실제로 붙여 넣기 전에 붙여 넣기 이벤트가 시작됩니다.
developerbmw

85

최신 브라우저에, 당신은 사용할 수 있습니다 이벤트를 :input

데모

$("#textbox").on('input',function() {alert("Change detected!");});

1
니스-나는 그것을 몰랐다. HTML5입니까?
복원 Monica Monica Cellio

4
나는이 답변을 받아 들이고 싶지만 당신이 말했듯이 이것은 현대 브라우저를위한 솔루션입니다. 내 웹 응용 프로그램은 여전히 ​​IE8을 사용하는 사용자를 대상으로하며 IE8에서는 작동하지 않습니다. :( 무엇을 말할 수
있습니까

예를 들어 모든 텍스트를 선택하고 Delete 키를 누르면 실행되지 않습니다
jjxtra

4
$(this).bind('input propertychange', function() {
        //your code here
    });

이것은 입력, 붙여 넣기, 마우스 오른쪽 클릭 등의 작업에 사용됩니다.


1
숫자 필드에서 위쪽 화살표를 누르는 것과 같은 작업을 수행하면 여러 이벤트를 발생시키지 않으므로 최상의 솔루션처럼 보입니다.
Justin

간단하고 효율적인 솔루션
Abdulhameed

4
if you write anything in your textbox, the event gets fired.
code as follows :

HTML :

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

JS :

<script type="text/javascript">
  $(function () {
      $("#textbox").bind('input', function() {
      alert("letter entered");
      });
   });
</script>

2

이 시도:

$("#textbox").bind('paste',function() {alert("Change detected!");});

JSFiddle 데모를 참조하십시오 .


붙여 넣기에 관한 질문으로 작동하지 않습니다. 마우스 오른쪽 버튼 클릭 후 붙여 넣기시 이벤트가 시작되지 않습니다.
Dhaval Marthak 2016 년

그리고 그것의 사용과 어떤 관련이 bind()있습니까?
복원 Monica Monica Cellio 2016 년

그는 KeyUp 이벤트는 마우스 오른쪽 버튼으로 클릭 +가에 붙여 넣을 때, 그래서 해고되지 않고 그 것을 이야기 keyup하고 change()그 다음 이벤트를 실행하고자하는 ID, 그래서 자신의 전형적인 행동을 가지고 paste있는 옵션이있을 수 있습니다
Dhaval Marthak

물론, 그러나 여전히을 bind대신 사용하는 이유는 대답하지 않습니다 on.
복원 Monica Monica Cellio

0

아래 코드를 사용해보십시오 :

$("#textbox").on('change keypress paste', function() {
  console.log("Handler for .keypress() called.");
});

질문에서 언급했듯이 마우스로 붙여 넣기를 어떻게 캡처합니까?
복원 Monica Monica Cellio

그는 다음과 같이 말했기 때문에 적합하다event to be fired on every character change in the textbox
Venkat.R

모든 질문을 읽고 싶다면 당신이 볼 수있을 거라고 그는 또한 말했다"...but it's a known fact that the keyup event isn't fired on right-click-and-paste."
분석 재개 모니카 Cellio

0

당신의 의견을 읽으면 더러워졌습니다. 이것은 올바른 방법은 아니지만 해결 방법이 될 수 있습니다.

$(function() {
    $( "#inputFieldId" ).autocomplete({
        source: function( event, ui ) {
            alert("do your functions here");
            return false;
        }
    });
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.