텍스트 상자가 포커스를 잃을 때까지 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.