jQuery metin kutusu değişiklik etkinliği, metin kutusu odağı kaybedene kadar çalışmıyor mu?


133

Metin kutusundaki jQuery değişiklik etkinliğinin, metin kutusunun dışına tıklayana kadar tetiklenmediğini öğrendim.

HTML:

<input type="text" id="textbox" />

JS:

$("#textbox").change(function() {alert("Change detected!");});

Bkz JSFiddle üzerinde demo

Uygulamam, olayın metin kutusundaki her karakter değişikliğinde tetiklenmesini gerektiriyor. Bunun yerine keyup kullanmayı bile denedim ...

$("#textbox").keyup(function() {alert("Keyup detected!");});

... ancak anahtar etkinliğinin sağ tıklayıp yapıştırma işleminde tetiklenmediği bilinen bir gerçektir.

Herhangi bir çözüm var mı? Her iki dinleyicinin de olması herhangi bir soruna yol açacak mı?


^^ Bu. İstediğiniz kadar olay işleyicisine sahip olabilirsiniz.
Monica Cellio'yu eski durumuna getirin

Yanıtlar:


298

Her iki olaya da bağlanmak, bunu yapmanın tipik yoludur. Ayrıca, paste olayına da bağlanabilirsiniz.

Bunun gibi birden çok olaya bağlanabilirsiniz:

$("#textbox").on('change keyup paste', function() {
    console.log('I am pretty sure the text box changed');
});

Bu konuda bilgiçlikçi olmak istiyorsanız, metnin sürüklenmesini sağlamak için mouseup'a da bağlanmalı lastValueve metnin gerçekten değiştiğinden emin olmak için bir değişken eklemelisiniz :

var lastValue = '';
$("#textbox").on('change keyup paste mouseup', function() {
    if ($(this).val() != lastValue) {
        lastValue = $(this).val();
        console.log('The text box really changed this time');
    }
});

Ve super duperbilgiçlik taslamak istiyorsanız, otomatik doldurma, eklentiler vb. İçin bir aralık zamanlayıcı kullanmalısınız:

var lastValue = '';
setInterval(function() {
    if ($("#textbox").val() != lastValue) {
        lastValue = $("#textbox").val();
        console.log('I am definitely sure the text box realy realy changed this time');
    }
}, 500);

9
Sonunda birisi soruyu okudu ve her şeyi yanıtladı!
Monica Cellio'yu

4
.on('change keyup paste', function() {...}aslında birden çok kez ateşleniyor! Bir karakter yazıp ardından dışarıya tıklarsam, hem 'değiştir' hem de 'anahtarlama' olayları tetiklenir ve bu da işlevin birden çok kez yürütülmesine yol açar! Sağ tıklayıp ardından dışarıya tıklarsam, hem 'değiştir' hem de 'yapıştır' tetiklenir. Kahrolası! Yapıştırmak için Ctrl + V'yi kullandığınızda ve ardından dışarıya tıkladığınızda üç kez ateşlenir !!
2013

1
@SNag evet, aynı şekilde lastValue, değiştiğinden emin olmak için bir değişken kullanarak bir kontrol eklemelisiniz .
Petah

1
+1. Ancak, burada 'değişim' bağlayıcılığı gerekli mi? Bunun hangi davayı ele alacağı bana açık değil, ateşlendiğinde (değiştirildiğinde) halihazırda ele alınmış olmayacaktı.
Madbreaks

1
Yapıştırma etkinliği, metin gerçekten yapıştırılmadan önce tetikleniyor
developerbmw

85

Modern tarayıcılarda, kullanabilirsiniz olayı :input

DEMO

$("#textbox").on('input',function() {alert("Change detected!");});

1
Güzel - bunun farkında değildim. Bu bir HTML5 şey mi?
Monica Cellio'yu eski durumuna getirin

4
Bu cevabı kabul etmeyi çok isterdim, ama dediğin gibi, bu modern tarayıcılar için bir çözüm. Web uygulamam hala IE8 kullanan kullanıcıları hedefliyor ve bu IE8'de çalışmıyor. :( Ne diyebilirim .. :(
2013

Örneğin tüm metni seçip sil tuşuna
basarsanız ateşlenmez

4
$(this).bind('input propertychange', function() {
        //your code here
    });

Bu, yazma, yapıştırma, sağ tıklama, fare yapıştırma vb. İçin çalışır.


1
Bu en iyi çözüm gibi görünüyor çünkü sayısal bir alanda yukarı oka basmak gibi bir şey yaparsanız birden fazla olayı tetiklemiyor.
Justin

Basit ve etkili çözüm
Abdulhameed

4
if you write anything in your textbox, the event gets fired.
code as follows :

HTML:

<input type="text" id="textbox" />

JS:

<script type="text/javascript">
  $(function () {
      $("#textbox").bind('input', function() {
      alert("letter entered");
      });
   });
</script>

2

Bunu dene:

$("#textbox").bind('paste',function() {alert("Change detected!");});

Bkz JSFiddle üzerinde demo .


Soru yapıştırma üzerinde olduğu için çalışmıyor. etkinlik, sağ tıklayıp yapıştırma işleminde tetiklenmez.
Dhaval Marthak

Bunun kullanımıyla ne alakası var bind()?
Monica Cellio'yu eski durumuna getirin

o keyup olay sağ tık + üzerine yapıştırdığınızda, bu yüzden ateş değil ki o anlattı keyupve change()o da olayı yürütmek isteyen id böylece kendi tipik davranışa sahip pasteseçenek olabilir
Dhaval Marthak

Tabii ki, ama yine de neden bindyerine kullanımının yanıtını vermiyor on.
Monica Cellio'yu eski durumuna getirin

0

Aşağıdaki Kodu deneyin:

$("#textbox").on('change keypress paste', function() {
  console.log("Handler for .keypress() called.");
});

Soruda belirtildiği gibi bu, fareyle yapıştırmayı nasıl yakalar?
Monica Cellio'yu eski durumuna getirin

tuşa basmak uygunevent to be fired on every character change in the textbox
Venkat.R

Tüm soruyu okursanız, onun da şunu söylediğini görürsünüz:"...but it's a known fact that the keyup event isn't fired on right-click-and-paste."
Monica Cellio'yu eski durumuna getirin

0

Yorumlarınızı okumak beni kirli bir düzeltmeye götürdü. Bu doğru bir yol değil, biliyorum, ama geçici bir çözüm olabilir.

$(function() {
    $( "#inputFieldId" ).autocomplete({
        source: function( event, ui ) {
            alert("do your functions here");
            return false;
        }
    });
});
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.