Jak mogę powiązać ze zdarzeniem zmiany pola tekstowego w jQuery?


219

Chcę uchwycić, jeśli nastąpiły jakieś zmiany <textarea>. Podobnie jak pisanie dowolnych znaków (usuwanie, cofanie) lub klikanie myszką i wklejanie lub wycinanie. Czy istnieje zdarzenie jQuery, które może być wyzwalane dla wszystkich tych zdarzeń?

Próbowałem zmienić zdarzenie, ale wyzwala on wywołanie zwrotne dopiero po tabulacji z komponentu.

Użyj : Chcę włączyć przycisk, jeśli <textarea>zawiera dowolny tekst.


18
Powiązanie z kluczowymi zdarzeniami nie wystarczy, ponieważ tekst można zmienić za pomocą myszy („wklej” / „wytnij” z menu kontekstowego lub przeciągnij i upuść).
— Konstantin Smoljanin

Podobne pytanie omówiono w Wykrywanie zamiany Textarea .
— dma_k

Odpowiedzi:


333

Wypróbuj to w rzeczywistości:

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

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

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

PRÓBNY

Działa to w przypadku wszelkich wprowadzanych zmian, pisania, wycinania, wklejania.


5
@Senthilnathan: Nie działa również w Chrome i FF, ponieważ po prostu go propertychangenie mainput
— Blaster

4
Uważaj, ponieważ właśnie rozważyłem, że żadne z tych dwóch zdarzeń nie jest uruchamiane w IE9 (nie sprawdziłem starszych wersji IE), gdy klawisz Backspace jest wciśnięty w obszarze tekstowym.
— Zappa,

26
Te dema używają <input type="text">, a nie<textarea>
— Ben Collins

5
Zmień „właściwość wprowadzania danych” na „zmianę danych wejściowych”, aby działała również w IE9. paulbakaus.com/2012/06/14/propertychange-on-internet-explorer-9
— c0D3l0g1c

11
Widzę, że użyłeś <input type = "textarea" cols = "10" rows = "4" /> w DEMO, poważnie?
— DrLightman

142

bindjest przestarzałe. Użyj on:

$("#textarea").on('change keyup paste', function() {
    // your code here
});

Uwaga: powyższy kod będzie uruchamiany wiele razy, raz dla każdego pasującego typu wyzwalacza. Aby sobie z tym poradzić, wykonaj coś takiego:

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 Demo


3
on("change", function() ....część nie pracuje dla mnie. Nie wyzwala żadnego alertu, ani logów konsoli, niczego. Jednak keyup działa jak urok.
— Sebastialonso

3
@Sebastialonso: on("change", function() ... Jest uruchamiany tylko wtedy, gdy obszar tekstowy przestaje być aktywny . Zapoznaj się z moim wcześniejszym pytaniem i wypróbuj to na tym skrzypcach - zmień obszar tekstowy, a następnie kliknij poza obszarem tekstowym, a powinieneś zobaczyć uruchamianie zdarzenia zmiany.
— SNag

@Sagnij ten kod nie działa na Chrome 45, ale działa na FF 41
— DariusVE

Jeśli jednak utknąłeś przy użyciu jQuery przed wersją 1.7, nie ma to zastosowania
— Code Jockey

upvoting do użytku z nieaktualną funkcją. Znacznie lepiej niż .bind ()
— Danny Harding,

79

Użyj inputwydarzenia.

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();
  }
});

W przypadku przeglądarki Internet Explorer wymaga to 9+, a nawet 10+, aby działać poprawnie.
— Udi

1
To rozwiązanie działa jak urok. Doskonale pokonuje ograniczenia procedur obsługi zdarzeń change () i keypress (). Dzięki tony widelce.
— Vickar

25

To pytanie wymagało bardziej aktualnej odpowiedzi ze źródłami. Oto, co faktycznie działa (choć nie musisz mi wierzyć na słowo):

// 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 w IE9 nie uruchamia się po uderzeniu w 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

ALE, aby uzyskać bardziej globalne rozwiązanie, z którego można korzystać w całym projekcie , zalecam użycie wtyczki textchange jQuery w celu uzyskania nowego textchangezdarzenia zgodnego z różnymi przeglądarkami . Został opracowany przez tę samą osobę, która zaimplementowała równoważne onChangewydarzenie dla ReactJS na Facebooku, którego używają w prawie całej swojej witrynie. I myślę, że można powiedzieć, że jeśli jest wystarczająco solidnym rozwiązaniem dla Facebooka, to prawdopodobnie jest wystarczająco solidny dla Ciebie. :-)

AKTUALIZACJA: Jeśli potrzebujesz funkcji takich jak obsługa przeciągania i upuszczania w Internet Explorerze, możesz zamiast tego sprawdzić pandellnajnowszą wersjęjquery-splendid-textchange .


Chociaż wydaje się, że „zmiana wyboru” działa tylko po zastosowaniu do dokumentu. Element aktywny można uzyskać za pomocą „document.activeElement”.
— 2016 r. O

11

2018, bez JQUERY

Pytanie jest z JQuery, to po prostu 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

Oto kolejna (nowoczesna), ale nieco inna wersja niż te wspomniane wcześniej. Testowane z IE9:

$('#textareaID').on('input change keyup', function () {
  if (this.value.length) {
    // textarea has content
  } else {
    // textarea is empty
  }
});

W przypadku przestarzałych przeglądarek możesz również dodać selectionchangei propertychange(jak wspomniano w innych odpowiedziach). Ale selectionchangenie działało dla mnie w IE9. Właśnie dlatego dodałem keyup.


2

Spróbuj zrobić to z focusout

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

1

Spróbuj tego ...

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

              // Write your code here       
 });

7
Powiązanie z kluczowymi zdarzeniami nie wystarczy, ponieważ tekst można zmienić za pomocą myszy („wklej” / „wytnij” z menu kontekstowego lub przeciągnij i upuść).
— Konstantin

1

.delegate jest jedynym, który działa dla mnie z jQuery JavaScript Library v2.1.1

 $(document).delegate('#textareaID','change', function() {
          console.log("change!");
    });

0

Po kilku eksperymentach wymyśliłem tę implementację:

$('.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;
        }
    });

Obsługuje zmiany do dowolnego rodzaju danych wejściowych i zaznaczania oraz obszarów tekstowych ignorujących klawisze strzałek i takie rzeczy jak ctrl, cmd, klawisze funkcyjne itp.

Uwaga: próbowałem tego tylko w FF, ponieważ jest to dodatek do FF.


-11

Spróbuj tego

 $('textarea').trigger('change');
 $("textarea").bind('cut paste', function(e) { });

to nie jest całkowicie złe. W rzeczywistości, jeśli łączy się $("#textarea").on('change keyup paste', function() {})i $('textarea').trigger('change');można rozwiązać problem, który uniemożliwia pasteautomatyczne działanie!
— loretoparisi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.