jQuery에서 텍스트 영역의 변경 이벤트에 어떻게 바인딩 할 수 있습니까?


220

변경 사항이 있으면 캡처하고 싶습니다 <textarea>. 모든 문자 (삭제, 백 스페이스)를 입력하거나 마우스를 클릭하여 붙여 넣기 또는 잘라 내기하는 것과 같습니다. 모든 해당 이벤트를 트리거 할 수있는 jQuery 이벤트가 있습니까?

변경 이벤트를 시도했지만 구성 요소에서 탭 아웃 한 후에 만 ​​콜백을 트리거합니다.

사용 : <textarea>텍스트 가 포함되어 있으면 버튼을 활성화하고 싶습니다 .


18
마우스로 텍스트를 변경할 수 있기 때문에 주요 이벤트에 바인딩하는 것만으로는 충분하지 않습니다 (컨텍스트 메뉴에서 "붙여 넣기"/ "잘라 내기"또는 끌어서 놓기).
Konstantin Smolyanin

Textarea onchange detection 에서도 비슷한 질문이 논의됩니다 .
dma_k

답변:


334

실제로 이것을 시도하십시오 :

$('#textareaID').bind('input propertychange', function() {

      $("#yourBtnID").hide();

      if(this.value.length){
        $("#yourBtnID").show();
      }
});

데모

변경, 타이핑, 자르기, 붙여 넣기 등 모든 변경 사항에 적용됩니다.


5
@Senthilnathan : Chrome 및 FF에서도 작동하지 않습니다. propertychange그 이유도 없기 때문입니다.input
Blaster

4
방금 백 스페이스 키를 텍스트 영역에서 누르면 IE9 에서이 두 이벤트 중 어느 것도 실행되지 않습니다 (이전 버전의 IE는 확인하지 않음).
Zappa

26
이 데모는 다음을 사용 <input type="text">하지 않습니다<textarea>
Ben Collins

5
IE9에서도 작동하도록 '입력 속성 변경'을 '입력 변경'으로 변경하십시오. paulbakaus.com/2012/06/14/propertychange-on-internet-explorer-9
c0D3l0g1c

11
DEMO에서 <input type = "textarea"cols = "10"rows = "4"/>를 심각하게 사용 했습니까?
DrLightman

142

bind더 이상 사용되지 않습니다. 사용 on:

$("#textarea").on('change keyup paste', function() {
    // your code here
});

참고 : 위의 코드는 일치하는 트리거 유형마다 한 번씩 여러 번 실행됩니다. 이를 처리하려면 다음과 같이하십시오.

var oldVal = "";
$("#textarea").on("change keyup paste", function() {
    var currentVal = $(this).val();
    if(currentVal == oldVal) {
        return; //check to prevent multiple simultaneous triggers
    }

    oldVal = currentVal;
    //action to be performed on textarea changed
    alert("changed!");
});

jsFiddle 데모


3
on("change", function() ....부분은 나를 위해 작동하지 않습니다. 경고 나 콘솔 로그 등을 트리거하지 않습니다. 하지만 키 업은 매력처럼 작동합니다.
Sebastialonso

3
@Sebastialonso 다음은 on("change", function() ... 되는 텍스트 영역에 포커스를 잃을 때 발사 만 . 이에 대한이전 질문 을 참조 하고이 바이올린 에서 사용해보십시오 . 텍스트 영역을 변경 한 다음 텍스트 영역 외부를 클릭하면 변경 이벤트가 발생합니다.
SNag

@SNag 코드는 Chrome 45에서는 작동하지 않지만 FF 41에서는 작동합니다.
DariusVE

버전 1.7 이전의 jQuery를 사용하지 않으면 적용되지 않습니다.
Code Jockey

더 이상 사용되지 않는 기능에 사용하기위한 투표. .bind ()보다 훨씬 낫다
Danny Harding

79

input이벤트를 사용하십시오 .

var button = $("#buttonId");
$("#textareaID").on('input',function(e){
  if(e.target.value === ''){
    // Textarea has no value
    button.hide();
  } else {
    // Textarea has a value
    button.show();
  }
});

Internet Explorer의 경우 제대로 작동하려면 9 이상 또는 10 이상이 필요합니다.
Udi

1
이 솔루션은 매력처럼 작동합니다. change () 및 keypress () 이벤트 핸들러의 한계를 완벽하게 극복합니다. 톤 포크 감사합니다.
Vickar

25

이 질문에는 출처와 함께 최신 답변이 필요했습니다. 이것은 실제로 작동하는 것입니다 (단, 내 말을 할 필요는 없지만).

// Storing this jQuery object outside of the event callback 
// prevents jQuery from having to search the DOM for it again
// every time an event is fired.
var $myButton = $("#buttonID")

// input           :: for all modern browsers [1]
// selectionchange :: for IE9 [2]
// propertychange  :: for <IE9 [3]
$('#textareaID').on('input selectionchange propertychange', function() {

  // This is the correct way to enable/disabled a button in jQuery [4]
  $myButton.prop('disabled', this.value.length === 0)

}

1 : https://developer.mozilla.org/en-US/docs/Web/Events/input#Browser_compatibility
2 : BACKSPACE / DEL을 수행 할 때 IE9의 oninput이 실행되지 않음
3 : CUT 3 : https : // msdn .microsoft.com / en-us / library / ms536956 (v = vs.85) .aspx
4 : http://api.jquery.com/prop/#prop-propertyName-function

그러나 프로젝트 전체에서 사용할 수있는보다 글로벌 한 솔루션을 위해 textchange jQuery 플러그인 을 사용 하여 브라우저 간 호환되는 새로운 textchange이벤트 를 얻는 것이 좋습니다 . 페이스 북의 ReactJS에 해당하는 이벤트를 구현 한 동일한 사람 이 개발했으며 ,onChange 거의 전체 웹 사이트에 사용합니다. 그리고 그것이 페이스 북을위한 충분한 솔루션이라면, 아마도 당신에게 충분히 강력 할 것입니다. :-)

업데이트 : Internet Explorer에서 끌어서 놓기 지원과 같은 기능이 필요한 경우 대신 pandell최신 업데이트 포크jquery-splendid-textchange 를 확인하십시오 .


"선택 변경"은 문서에 적용될 때만 작동합니다. "document.activeElement"를 사용하여 활성 요소를 얻을 수 있습니다.
tfE

11

JQUERY가없는 2018 년

문제는 JQuery 와 관련있으며 단지 FYI입니다.

JS

let textareaID = document.getElementById('textareaID');
let yourBtnID = document.getElementById('yourBtnID');
textareaID.addEventListener('input', function() {
    yourBtnID.style.display = 'none';
    if (textareaID.value.length) {
        yourBtnID.style.display = 'inline-block';
    }
});

HTML

<textarea id="textareaID"></textarea>
<button id="yourBtnID" style="display: none;">click me</div>

4

여기에 또 다른 (현대) 버전이 있지만 앞에서 언급 한 버전과 약간 다릅니다. IE9로 테스트했습니다.

$('#textareaID').on('input change keyup', function () {
  if (this.value.length) {
    // textarea has content
  } else {
    // textarea is empty
  }
});

오래된 브라우저의 경우 추가 selectionchange하고 propertychange(다른 답변에서 언급했듯이) 추가 할 수 있습니다 . 그러나 selectionchangeIE9에서는 나를 위해 작동하지 않았습니다. 그래서 내가 추가했습니다 keyup.


2

포커스 아웃으로 시도하십시오.

$("textarea").focusout(function() {
   alert('textarea focusout');
});

1

이 시도 ...

$("#txtAreaID").bind("keyup", function(event, ui) {                          

              // Write your code here       
 });

7
마우스로 텍스트를 변경할 수 있기 때문에 주요 이벤트에 바인딩하는 것만으로는 충분하지 않습니다 (컨텍스트 메뉴에서 "붙여 넣기"/ "잘라 내기"또는 끌어서 놓기).
Konstantin Smolyanin

1

.delegatejQuery JavaScript Library v2.1.1에서 작동하는 유일한 것입니다.

 $(document).delegate('#textareaID','change', function() {
          console.log("change!");
    });

0

몇 가지 실험 후이 구현을 생각해 냈습니다.

$('.detect-change')
    .on('change cut paste', function(e) {
        console.log("Change detected.");
        contentModified = true;
    })
    .keypress(function(e) {
        if (e.which !== 0 && e.altKey == false && e.ctrlKey == false && e.metaKey == false) {
            console.log("Change detected.");
            contentModified = true;
        }
    });

화살표 키와 ctrl, cmd, 기능 키 등을 무시하고 텍스트 영역뿐만 아니라 모든 종류의 입력 및 선택에 대한 변경 사항을 처리합니다.

참고 : FF 애드온 용이므로 FF에서만 시도했습니다.


-11

이 시도

 $('textarea').trigger('change');
 $("textarea").bind('cut paste', function(e) { });

이것은 완전히 잘못이 아닙니다. 실제로 자동으로 작동 하지 못하게하는 문제를 결합 $("#textarea").on('change keyup paste', function() {})하고 $('textarea').trigger('change');해결할 수 있다면 paste!
loretoparisi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.