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.
Versuchen Sie das eigentlich:
$('#textareaID').bind('input propertychange', function() {
$("#yourBtnID").hide();
if(this.value.length){
$("#yourBtnID").show();
}
});
Das funktioniert für alle Änderungen, die Sie vornehmen, eingeben, ausschneiden und einfügen.
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!");
});
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();
}
});
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.
Die Frage ist mit JQuery, es ist nur FYI.
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';
}
});
<textarea id="textareaID"></textarea>
<button id="yourBtnID" style="display: none;">click me</div>
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.
Versuchen Sie es mit focusout
$("textarea").focusout(function() {
alert('textarea focusout');
});
.delegate ist der einzige, der für mich mit jQuery JavaScript Library v2.1.1 arbeitet.
$(document).delegate('#textareaID','change', function() {
console.log("change!");
});
versuche dies ...
$("#txtAreaID").bind("keyup", function(event, ui) {
// Write your code here
});
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.