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.

Lolly
źródło
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.

Blaster
źródło
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

Szkopuł
źródło
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();
  }
});
Steel Brain
źródło
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 .

Chris Fritz
źródło
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>
rap-2-h
źródło
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.

kevinweber
źródło
2

Spróbuj zrobić to z focusout

$("textarea").focusout(function() {
   alert('textarea focusout');
});
llioor
źródło
1

Spróbuj tego ...

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

              // Write your code here       
 });
pozostać głodny
źródło
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!");
    });
eeadev
źródło
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.

Kogut 242
źródło
-11

Spróbuj tego

 $('textarea').trigger('change');
 $("textarea").bind('cut paste', function(e) { });
Rajesh Tandukar
źródło
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