Как я могу привязаться к событию изменения textarea в jQuery?

Я хочу захватить, если какие-либо изменения произошли с <textarea>. Например, ввод любых символов (удаление,backspace) или щелчок мыши и вставка или вырезание. Есть ли событие jQuery, которое может вызвать все эти события?

Я попытался изменить событие, но он запускает обратный вызов только после табуляции из компонента.

использовать: Я хочу включить кнопку если <textarea> содержит какого-либо текста.

11 ответов


попробуйте это на самом деле:

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

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

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

демо

что работает на любые изменения, ввод, резка, оклейка.


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


Добро пожаловать в 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#Browser_compatibility
2: oninput в IE9 не срабатывает, когда мы нажимаем BACKSPACE / DEL / do CUT
3:https://msdn.microsoft.com/en-us/library/ms536956 (v=против 85).aspx
Четыре: http://api.jquery.com/prop/#prop-propertyName-function

но для более глобального решения, которое вы можете использовать во всем своем проекте, я рекомендую использовать плагин 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 (Как уже упоминалось в других ответов). Но!--1--> не работал для меня в IE9. Вот почему я добавил keyup.


попробуйте сделать это с помощью focusout

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

попробуйте это ...

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

              // Write your code here       
 });

.делегат это единственный, который работает со мной с jQuery JavaScript библиотека 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) { });