Як я можу прив'язатись до події зміни текстової області в 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.