Як я можу прив'язатись до події зміни текстової області в jQuery?


219

Я хочу зафіксувати, якщо якісь зміни відбулися <textarea>. Як і введення будь-яких символів (видалення, повернення назад) або клацання миші та вставлення або вирізання. Чи є подія jQuery, яка може викликати всі ці події?

Я спробував змінити подію, але вона викликає зворотний виклик лише після вкладки з компонента.

Використання : я хочу включити кнопку, якщо <textarea>містить текст.


18
Прив'язування до ключових подій недостатньо, оскільки текст можна змінювати мишею ("вставити" / "вирізати" з контекстного меню або перетягнути).
Костянтин Смолянін

Аналогічне питання обговорюється у виявленні зміни обміну текстовими районами .
dma_k

Відповіді:


333

Спробуйте це власне:

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

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

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

DEMO

Це працює для будь-яких змін, які ви вносите, вводячи, вирізаючи, вставляючи.


5
@Senthilnathan: Не працює для Chrome і FF також добре, тому що його propertychangeтеж немаєinput
Blaster

4
Будьте обережні, як я щойно вирішив, що жодна з цих двох подій у IE9 (не перевіряється старіші версії IE), коли натискається клавіша зворотної області в текстовій області.
Заппа

26
Ці демонстрації використовують <input type="text">, але не<textarea>
Бен Коллінз

5
Змініть "зміни властивості введення" на "зміна вводу", щоб воно працювало і в IE9. paulbakaus.com/2012/06/14/propertychange-on-internet-explorer-9
c0D3l0g1c

11
Я бачу, ви використовували <input type = "textarea" cols = "10" рядки = "4" /> у DEMO, серйозно?
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() ....частина не працює для мене. Не викликає жодного попередження, ані консольних журналів. Однак для клавіатури працює як шарм.
Себастіалонсо

3
@Sebastialonso: on("change", function() ... буде звільнений тільки тоді , коли текстове поле втрачає фокус . Зверніться до цього з моїм попереднім запитанням і спробуйте його на цій скрипці - змініть текстову область, потім натисніть за межі текстової області, і ви побачите, як відбувається подія зміни.
SNag

@SNag цей код не працює на Chrome 45, але він працює в FF 41
DariusVE

Якщо ви зациклювались на використанні jQuery до версії 1.7, це не стосується
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+.
Уді

1
Це рішення працює як шарм. Прекрасно долає обмеження обробників подій змін () та натискання клавіш (). Спасибі тонна виделки.
Вікар

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: вхід в IE9 не спрацьовує, коли ми натискаємо BACKSPACE / DEL / do CUT
3: https: // msdn .microsoft.com / en-us / library / ms536956 (v = vs.85) .aspx
4: http://api.jquery.com/prop/#prop-propertyName-function

АЛЕ, для більш глобального рішення, яке можна використовувати протягом усього проекту , я рекомендую використовувати плагін jcuery textchange для отримання нового textchangeподії, сумісної між веб-браузерами . Він був розроблений тією ж особою, яка здійснила еквівалентну onChangeподію для Facebook ReactJS, яку вони використовують майже на своєму веб-сайті. І я думаю, що це безпечно сказати, якщо це досить надійне рішення для Facebook, це, ймовірно, достатньо надійне для вас. :-)

ОНОВЛЕННЯ: Якщо вам потрібні такі функції, як підтримка перетягування та перезапускання в Internet Explorer, ви, можливо, захочете перевірити pandellостанні оновлені вилкиjquery-splendid-textchange .


Хоча здається, що "зміна вибору" працює лише тоді, коли застосовується до документа. Активний елемент можна отримати за допомогою "document.activeElement".
tfE

11

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(як зазначено в інших відповідях). Але selectionchangeне працював для мене в IE9. Ось чому я додав keyup.


2

Спробуйте це зробити з фокусуванням

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

1

спробуйте це ...

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

              // Write your code here       
 });

7
Прив'язування до ключових подій недостатньо, оскільки текст можна змінювати мишею ("вставити" / "вирізати" з контекстного меню або перетягнути).
Костянтин Смолянін

1

.delegate - це єдиний, хто працює зі мною з бібліотекою jQuery JavaScript 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.