Bagaimana saya bisa mengikat ke acara perubahan dari textarea di jQuery?

219

Saya ingin menangkap jika ada perubahan yang terjadi <textarea>. Seperti mengetik karakter apa saja (menghapus, backspace) atau klik mouse dan tempel atau potong. Apakah ada acara jQuery yang dapat memicu untuk semua acara itu?

Saya mencoba mengubah acara, tetapi memicu callback hanya setelah keluar dari komponen.

Gunakan : Saya ingin mengaktifkan tombol jika a <textarea>mengandung teks apa pun.

Lolly
sumber
18
Mengikat ke acara utama tidak cukup karena teks dapat diubah dengan mouse ("tempel" / "potong" dari menu konteks atau seret & lepas).
Konstantin Smolyanin
Pertanyaan serupa didiskusikan dalam deteksi pertukaran Textarea .
dma_k

Jawaban:

333

Coba ini sebenarnya:

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

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

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

DEMO

Itu berfungsi untuk setiap perubahan yang Anda buat, mengetik, memotong, menempel.

Blaster
sumber
5
@Senthilnathan: Tidak ada karya di Chrome dan FF juga bagi saya karena tidak propertychangeada jugainput
Blaster
4
Berhati-hatilah karena saya baru saja mengatakan bahwa tidak satu pun dari kedua peristiwa ini yang menyala di IE9 (belum memeriksa versi IE yang lebih lama) ketika tombol backspace ditekan dalam textarea.
Zappa
26
Demo ini menggunakan <input type="text">, bukan<textarea>
Ben Collins
5
Ubah 'input propertychange' menjadi 'input change' sehingga berfungsi di IE9 juga. paulbakaus.com/2012/06/14/propertychange-on-internet-explorer-9
c0D3l0g1c
11
Saya melihat Anda menggunakan <input type = "textarea" cols = "10" rows = "4" /> dalam DEMO, serius?
DrLightman
142

bindsudah ditinggalkan. Gunakan on:

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

Catatan: Kode di atas akan aktif beberapa kali, satu kali untuk setiap tipe pemicu yang cocok. Untuk mengatasinya, lakukan sesuatu seperti ini:

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!");
});

Demo jsFiddle

Merobek
sumber
3
yang on("change", function() ....bagian tidak bekerja untuk saya. Tidak memicu peringatan, atau log konsol, apa pun. Untuk keyup bekerja seperti pesona.
Sebastialonso
3
@Sebastialonso: The on("change", function() ... adalah hanya dipecat ketika textarea kehilangan fokus . Rujuk pertanyaan saya sebelumnya untuk ini, dan cobalah biola ini - ubah textarea, lalu klik di luar textarea, dan Anda akan melihat perubahan event menyala.
SNag
@SNag kode yang tidak bekerja di Chrome 45, tetapi bekerja pada FF 41
DariusVE
Jika Anda terjebak menggunakan jQuery sebelum versi 1.7, maka ini tidak berlaku
Code Jockey
upvoting untuk digunakan pada fungsi yang tidak usang. Jauh lebih baik daripada .bind ()
Danny Harding
79

Gunakan suatu inputacara.

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();
  }
});
Otak Baja
sumber
Untuk Internet Explorer, ini membutuhkan 9+, atau bahkan 10+ untuk berfungsi dengan baik.
Udi
1
Solusi ini bekerja seperti pesona. Mengatasi penangan event limitatin perubahan () dan penekanan tombol () dengan sempurna. Terima kasih banyak.
Vickar
25

Pertanyaan ini membutuhkan jawaban yang lebih mutakhir, dengan sumber-sumber. Inilah yang sebenarnya berhasil (meskipun Anda tidak harus mengambil kata saya untuk itu):

// 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 di IE9 tidak menyala ketika kita menekan 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

TETAPI, untuk solusi yang lebih global yang dapat Anda gunakan di seluruh proyek Anda , saya sarankan menggunakan plugin textchange jQuery untuk mendapatkan acara baru yang kompatibel lintas-browser textchange. Ini dikembangkan oleh orang yang sama yang menerapkan onChangeacara yang setara untuk ReactJS Facebook, yang mereka gunakan untuk hampir seluruh situs web mereka. Dan saya pikir aman untuk mengatakan, jika itu solusi yang cukup kuat untuk Facebook, itu mungkin cukup kuat untuk Anda. :-)

PEMBARUAN: Jika Anda membutuhkan fitur seperti dukungan seret dan lepas di Internet Explorer, Anda mungkin ingin memeriksa pandellgarpu yang lebih baru diperbaruijquery-splendid-textchange .

Chris Fritz
sumber
Meskipun tampaknya "perubahan seleksi" hanya berfungsi bila diterapkan pada dokumen. Elemen aktif bisa didapat dengan "document.activeElement".
tfE
11

2018, tanpa JQUERY

Pertanyaannya adalah dengan JQuery, itu hanya 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
sumber
4

Ini versi lain (modern) tetapi sedikit berbeda dari yang disebutkan sebelumnya. Diuji dengan IE9:

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

Untuk browser yang sudah ketinggalan zaman, Anda juga dapat menambahkan selectionchangedan propertychange(seperti yang disebutkan dalam jawaban lain). Tetapi selectionchangetidak berhasil untuk saya di IE9. Itu sebabnya saya menambahkan keyup.

kevinweber
sumber
2

Coba lakukan dengan fokus

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

coba ini ...

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

              // Write your code here       
 });
tetap lapar
sumber
7
Mengikat ke acara utama tidak cukup karena teks dapat diubah dengan mouse ("tempel" / "potong" dari menu konteks atau seret & lepas).
Konstantin Smolyanin
1

.delegate adalah satu-satunya yang berfungsi untuk saya dengan jQuery JavaScript Library v2.1.1

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

Setelah beberapa percobaan saya datang dengan implementasi ini:

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

Menangani perubahan untuk segala jenis input dan memilih serta textareas mengabaikan tombol panah dan hal-hal seperti ctrl, cmd, tombol fungsi, dll.

Catatan: Saya hanya mencoba ini di FF karena ini untuk add-on FF.

Ayam jantan242
sumber
-11

Coba ini

 $('textarea').trigger('change');
 $("textarea").bind('cut paste', function(e) { });
Rajesh Tandukar
sumber
ini tidak sepenuhnya salah. Bahkan jika seseorang menggabungkan $("#textarea").on('change keyup paste', function() {})dan $('textarea').trigger('change');dapat mengatasi masalah yang mencegah pasteuntuk bekerja secara otomatis!
loretoparisi