web-dev-qa-db-ger.com

Wie kann ich an das Änderungsereignis einer Textfläche in jQuery binden?

Ich möchte erfassen, ob Änderungen an <textarea> vorgenommen wurden. So wie Sie beliebige Zeichen eingeben (Löschen, Rücktaste) oder mit der Maus klicken und einfügen oder ausschneiden. Gibt es ein jQuery-Ereignis, das für alle diese Ereignisse ausgelöst werden kann? 

Ich habe ein Änderungsereignis ausprobiert, aber der Callback wird erst ausgelöst, nachdem die Komponente verlassen wurde.

Verwenden Sie : Ich möchte eine Schaltfläche aktivieren, wenn ein <textarea> Text enthält.

195
Mojoy

Versuchen Sie das eigentlich:

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

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

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

DEMO

Das funktioniert für alle Änderungen, die Sie vornehmen, eingeben, ausschneiden und einfügen.

308
Blaster

bind ist veraltet. Verwenden Sie on:

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

Hinweis: Der obige Code wird mehrmals ausgelöst, einmal für jeden passenden Triggertyp. Um dies zu handhaben, machen Sie so etwas:

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 Demo

122
SNag

Willkommen im Jahr 2015, wo wir eine neue input veranstaltung haben.

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();
  }
});
68
Steel Brain

Diese Frage musste anhand der Quellen aktueller beantwortet werden. Dies ist, was eigentlich funktioniert (obwohl Sie mein Wort nicht dafür nehmen müssen):

// 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: oninput in IE9 wird nicht ausgelöst, wenn wir BACKSPACE/DEL/do CUT drücken
3: https://msdn.Microsoft.com/de-de/library/ms536956(v=vs.85).aspx
4: http://api.jquery.com/prop/#prop-propertyName-function

BUT, für eine globalere Lösung, die Sie im gesamten Projekt verwenden können, empfehle ich die Verwendung von dem textchange-jQuery-Plugin , um ein neues, browserübergreifendes textchange-Ereignis zu erhalten. Es wurde von der gleichen Person entwickelt, die das entsprechende onChange-Ereignis für Facebook's ReactJS implementierte, das sie fast für ihre gesamte Website verwenden. Und ich denke, es ist sicher zu sagen: Wenn es eine robuste Lösung für Facebook ist, ist es wahrscheinlich robust genug für Sie. :-)

UPDATE: Wenn Sie Funktionen wie Drag & Drop-Unterstützung in Internet Explorer benötigen, sollten Sie stattdessen den kürzlich aktualisierten Zweig von pandell VON jquery-splendid-textchange auschecken.

20
Chris Fritz

2018, ohne JQUERY

Die Frage ist mit JQuery, es ist nur 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>
8
rap-2-h

Hier ist eine andere (moderne), aber etwas andere Version als die zuvor genannten. Getestet mit IE9:

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

Für veraltete Browser können Sie auch selectionchange und propertychange hinzufügen (wie in anderen Antworten erwähnt). Aber selectionchange hat für mich in IE9 nicht funktioniert. Deshalb habe ich keyup hinzugefügt.

4
kevinweber

Versuchen Sie es mit focusout

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

.delegate ist der einzige, der für mich mit jQuery JavaScript Library v2.1.1 arbeitet.

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

versuche dies ...

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

              // Write your code here       
 });
1
stay_hungry

Nach einigen Experimenten kam ich zu dieser Implementierung:

$('.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;
        }
    });

Behandelt Änderungen an jeder Art von Eingabe und Auswahl sowie Textbereichen, die Pfeiltasten und Dinge wie Strg, Cmd, Funktionstasten usw. ignorieren.

Hinweis: Ich habe dies nur in FF versucht, da es sich um ein FF-Add-On handelt.

0
Rooster242