JQuery'de bir textarea değişiklik olayına nasıl bağlanabilirim?


220

Herhangi bir değişiklik olursa yakalamak istiyorum <textarea>. Herhangi bir karakteri yazmak (silme, geri alma) veya fare tıklaması ile yapıştırın veya kesin. Tüm bu olaylar için tetiklenebilecek bir jQuery olayı var mı?

Change olayı denedim, ancak yalnızca bileşenden sekme sonra geri aramayı tetikler.

Kullan : a <textarea>herhangi bir metin içeriyorsa bir düğmeyi etkinleştirmek istiyorum .


18
Metin fare ile değiştirilebildiğinden (bağlam menüsünden "yapıştır" / "kes" veya sürükleyip bırak) önemli olaylara bağlanmak yeterli değildir.
Konstantin Smolyanin

Benzer soru Textarea değişim değişimi tespitinde tartışılmıştır .
dma_k

Yanıtlar:


334

Bunu gerçekten deneyin:

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

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

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

DEMO

Yaptığınız, yazarak, keserek, yapıştırarak yaptığınız değişiklikler için işe yarar.


5
@Senthilnathan: Chrome ve FF'de benim için de çalışma yok çünkü sadece propertychangeorada değilinput
Blaster

4
Ben sadece bu iki olaydan hiçbiri geri tuşu bir textarea basıldığında IE9 (IE eski sürümlerini kontrol etmedim) yangın olduğunu dicsovered dikkat edin.
Zappa

26
Bu demolar kullanıyor <input type="text">, değil<textarea>
Ben Collins

5
IE9'da da çalışması için 'input propertychange' değerini 'input change' olarak değiştirin. paulbakaus.com/2012/06/14/propertychange-on-internet-explorer-9
c0D3l0g1c

11
DEMO'da <input type = "textarea" cols = "10" satır = "4" /> kullandığınızı görüyor musunuz?
DrLightman

142

bindkullanımdan kaldırıldı. Kullanım on:

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

Not: Yukarıdaki kod, eşleşen her tetikleyici türü için bir kez olmak üzere birçok kez tetiklenir. Bununla başa çıkmak için şöyle bir şey yapın:

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 Demosu


3
bu on("change", function() ....kısım benim için çalışmıyor. Hiçbir uyarıyı veya konsol günlüklerini, hiçbir şeyi tetiklemez. Çünkü keyup bir cazibe gibi çalışıyor.
Sebastialonso

3
@Sebastialonso: on("change", function() ... edilir textarea odağı kaybettiğinde ateş sadece . Bunun için önceki soruma bakın ve bu keman üzerinde deneyin - textarea'yı değiştirin, ardından textarea'nın dışına tıklayın ve değişiklik etkinliğinin tetiklendiğini görmelisiniz.
SNag

@ Bu kodu Chrome 45'te çalışmıyor, ancak FF 41
DariusVE

Bununla birlikte, 1.7 sürümünden önce jQuery kullanarak sıkıştıysanız, bu geçerli değildir
Kod Jockey

kullanımdan kaldırılmış işlevde kullanım için oylama. .Bind ()
Danny Harding'dan

79

Bir inputetkinlik kullanın .

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 için düzgün çalışması için 9+ hatta 10+ gerekir.
Udi

1
Bu çözüm bir cazibe gibi çalışır. Change () ve keypress () olay işleyicilerinin sınırlamalarının mükemmel bir şekilde üstesinden gelir. Bir ton çatal teşekkürler.
Vickar

25

Bu sorunun kaynakları ile daha güncel bir cevaba ihtiyacı vardı. Bu gerçekten işe yarıyor (bunun için sözümü almak zorunda değilsin):

// 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/tr-TR/docs/Web/Events/input#Browser_compatibility
2: BACKSPACE / DEL / do CUT
3'e bastığımızda IE9'daki giriş ateşlenmiyor : https: // msdn .microsoft.com / tr-tr / kütüphane / ms536956 (v = vs.85) .aspx
4: http://api.jquery.com/prop/#prop-propertyName-function

AMA, projeniz boyunca kullanabileceğiniz daha küresel bir çözüm için , yeni, çapraz tarayıcı uyumlu bir etkinlik kazanmak için textchange jQuery eklentisini kullanmanızı tavsiye ederim textchange. Facebook'un ReactJS'si için neredeyse tüm web sitesi için kullandıkları eşdeğer etkinliği uygulayan aynı kişi tarafından geliştirildi onChange. Ve bence, Facebook için yeterince sağlam bir çözümse, muhtemelen sizin için yeterince sağlam olduğunu söylemek güvenli. :-)

GÜNCELLEME: Internet Explorer'da sürükle ve bırak desteği gibi özelliklere ihtiyacınız varsa, bunun yerine pandelldaha yeni güncellenen çatalınıjquery-splendid-textchange kontrol etmek isteyebilirsiniz .


Görünüşe göre "selectionchange" yalnızca belgeye uygulandığında çalışır. Etkin öğe "document.activeElement" ile elde edilebilir.
tfE

11

2018, JQUERY olmadan

Soru ile sadece Bilginize var, JQuery.

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

İşte daha önce bahsedilenlerden başka (modern) ama biraz farklı bir versiyon. IE9 ile test edilmiştir:

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

Eski tarayıcılar için ayrıca selectionchangeve propertychange(diğer yanıtlarda belirtildiği gibi) ekleyebilirsiniz . Ama selectionchangeIE9'da benim için çalışmadı. Bu yüzden ekledim keyup.


2

Odaklama ile yapmaya çalışın

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

1

bunu dene ...

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

              // Write your code here       
 });

7
Metin fare ile değiştirilebildiğinden (bağlam menüsünden "yapıştır" / "kes" veya sürükleyip bırak) önemli olaylara bağlanmak yeterli değildir.
Konstantin Smolyanin

1

.delegate bana jQuery JavaScript Library v2.1.1 ile çalışan tek kişi

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

0

Bazı deneylerden sonra bu uygulamaya geldim:

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

Herhangi bir giriş ve seçim değişikliğinin yanı sıra ok tuşlarını ve ctrl, cmd, işlev tuşları vb.

Not: Bunu sadece bir FF eklentisi olduğu için FF'de denedim.


-11

Bunu dene

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

bu tamamen yanlış değil. Aslında bir kişi otomatik olarak çalışmayı engelleyen sorunu birleştirir $("#textarea").on('change keyup paste', function() {})ve $('textarea').trigger('change');giderebilirse paste!
loretoparisi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.