Как я могу привязаться к событию изменения текстовой области в jQuery?
Я хочу захватить, если какие-либо изменения произошли с <textarea>
, Например, ввод любых символов (удаление, возврат) или щелчок мышью и вставка или вырезание. Есть ли событие jQuery, которое может сработать для всех этих событий?
Я попытался изменить событие, но он вызывает обратный вызов только после выхода из компонента.
Использование: я хочу включить кнопку, если <textarea>
содержит любой текст.
11 ответов
Попробуйте это на самом деле:
$('#textareaID').bind('input propertychange', function() {
$("#yourBtnID").hide();
if(this.value.length){
$("#yourBtnID").show();
}
});
DEMO
Это работает для любых изменений, которые вы делаете, печатать, вырезать, вставлять.
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!");
});
Добро пожаловать в 2015 году, где у нас есть новый 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();
}
});
На этот вопрос требовался более актуальный ответ с источниками. Вот что на самом деле работает (хотя вы не должны верить мне на слово):
// 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
2: oninput в IE9 не срабатывает, когда мы нажимаем BACKSPACE / DEL / do CUT
3: https://msdn.microsoft.com/en-us/library/ms536956(v=vs.85).aspx
4: http://api.jquery.com/prop/
НО, для более глобального решения, которое вы можете использовать на протяжении всего проекта, я рекомендую использовать плагин textchange jQuery, чтобы получить новый кросс-браузер-совместимый textchange
событие. Он был разработан тем же человеком, который реализовал эквивалент onChange
мероприятие для ReactJS Facebook, которое они используют почти для всего своего сайта. И я думаю, можно с уверенностью сказать, что если это достаточно надежное решение для Facebook, оно, вероятно, достаточно надежно для вас.:-)
ОБНОВЛЕНИЕ: если вам понадобятся такие функции, как поддержка перетаскивания в Internet Explorer, вы можете вместо этого попробовать pandell
Недавно обновленный форкjquery-splendid-textchange
,
2018, без JQUERY
Вопрос с JQuery, это просто К вашему сведению.
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>
Вот еще одна (современная), но немного другая версия, чем упомянутые ранее. Протестировано с IE9:
$('#textareaID').on('input change keyup', function () {
if (this.value.length) {
// textarea has content
} else {
// textarea is empty
}
});
Для устаревших браузеров вы также можете добавить selectionchange
а также propertychange
(как упоминалось в других ответах). Но selectionchange
не работал для меня в IE9. Вот почему я добавил keyup
,
Попробуйте сделать это с фокусом
$("textarea").focusout(function() {
alert('textarea focusout');
});
Попробуй это...
$("#txtAreaID").bind("keyup", function(event, ui) {
// Write your code here
});
.delegate - единственный, кто работает со мной с jQuery JavaScript Library v2.1.1
$(document).delegate('#textareaID','change', function() {
console.log("change!");
});
После некоторых экспериментов я придумал эту реализацию:
$('.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.
Попробуй это
$('textarea').trigger('change');
$("textarea").bind('cut paste', function(e) { });