Bir tuşa basma olayından SONRA nasıl jquery .val () alabilirim?


101

Bende var:

$(someTextInputField).keypress(function() {
  alert($(this).val());
});

Artık uyarı her zaman tuşa basmadan ÖNCE değeri döndürür (örneğin alan boş, 'a' yazıyorum ve uyarı bana '' veriyor. Sonra 'b' yazıyorum ve uyarı bana 'a' ... veriyor). Ama tuşa basıldıktan SONRA değeri istiyorum - bunu nasıl yapabilirim?

Arka plan: Metin alanı en az bir karakter içerdiğinde bir düğmeyi etkinleştirmek istiyorum. Bu yüzden bu testi her tuşa basma olayında çalıştırıyorum, ancak döndürülen val () kullanarak sonuç her zaman bir adım geride kalıyor. Change () olayını kullanmak benim için bir seçenek değil çünkü o zaman metin kutusundan çıkana kadar düğme devre dışı kalıyor. Bunu yapmanın daha iyi bir yolu varsa, duyduğuma sevindim!


Metin silinirse düğme tekrar devre dışı bırakılır mı? Eğer öyleyse, muhtemelen tuşa basmanız gerekecek.
Brilliand

Yanıtlar:


152

Şuna keypressdeğiştir keyup:

$(someTextInputField).on("keyup", function() {
  alert($(this).val());
});

keypresstuşa basıldığında keyupateşlenir, tuş bırakıldığında ateşlenir.


@Brilliand Haklısın. Bunun için bir çözüm yaptım, aşağıda yayınlanmıştır.
David Oliveros

7
iPhone / Android cihazlarda bunu kim gerçekleştiriyorsunuz? Anahtar işlevini desteklemiyorlar.
Merijn Den Houting

4
tuşa basmanın tanımı tam olarak doğru değil. keydown'un tanımı budur. bkz. quirksmode.org/dom/events/keys.html
challet

59

Kimsenin js "input" olayından bahsetmemesine şaşırdım:

$(someTextInputField).on('input', function() {
  alert($(this).val());
});

Önerilen.

https://developer.mozilla.org/en-US/docs/Web/Events/input


8
Vay canına, bu birçok cevaplanmamış / kötü cevaplanmış SO sorusunun cevabı.
Ben Racicot

4
Bu, giriş alanında ok tuşlarına basmayı, vardiya vb.
hovado

2
caniuse.com/#search=input Nispeten iyi tarayıcı desteği. Her anahtarı dinlemekten çok daha iyi cevap.
James Haug

1
Günümü kurtarıyor! Teşekkür ederim. Şu kodu kullandım: $ ['. Subject_mark']. On ("input", function () {var $ th = $ (this); $ th.val ($ th.val (). Replace (/ [^ 0-9] / g, function (str) {return '';}));
arsho


5

Alternatif olarak, 0 zaman aşımı ile keydown olayını kullanabilirsiniz.

Bu şekilde, kullanıcı tuşu basılı tutmayı bıraktığında değişiklikler uygulanmak yerine anında uygulanacaktır.

$(someTextInputField).on("keydown", function() {
  setTimeout(function($elem){
    alert($elem.val());
  }, 0, $(this));
});

Bu, Backspace tuşunu basılı tuttuğunuzda yine garip davranacaktır ... belki de 0 zaman aşımıyla tuşa basıldığında?
Brilliand

Ah, boş ver, OP metin alanı temizlendiğinde ne olacağını belirtmiyor.
Brilliand

4

onchangeÖnemli olaylardan herhangi birini kullanmak yerine bir olay işleyicisi bağlamak isteyebilirsiniz .

$(someTextInputField).change(function() {
    alert($(this).val());
});

Edit > PasteSağ Tıklama ve ardından Yapıştır işlevini kullanmak veya kullanmak bir değişiklik olayını tetikler ancak önemli bir olay oluşturmaz. Bazı tarayıcıların bir macun üzerindeki önemli bir olayı simüle edebileceğini unutmayın (ben hiçbirini bilmesem de) ancak bu davranışa güvenemezsiniz .


4

Bunun gibi bir şey dene:

$('#someField').keypress(function() {
  setTimeout(function() {
    if ($('#someField').val().length > 0)
      $('#theButton').attr('disabled', false);
  }, 1);
});

Bu, "tuşa basma" olay döngüsü tamamlandıktan sonra kodunuz neredeyse hemen ardından çalışacak şekilde bir zaman aşımı sağlar. Bu kadar kısa bir zamanlayıcı aralığı (tarayıcı tarafından yuvarlanmış olsa bile) fark edilmeyecektir.

düzenleme - ya da olabilir diğer herkesin dediği gibi onun semantik farklı olsa da, "KeyUp" kullanın.


Bu benig meselesi değil smart . Keyup olayı aynı sonucu sağlamaz. Tuş ile shift, ctrl vb. İçin farklı olaylar elde edersiniz - Shift veya ctrl tuşlarının durumunu kontrol etmeniz gereken bir dizi tuş olayından ziyade yazılan gerçek karakteri (ve işareti gibi) almak istiyorsanız, tuşa basma gidilecek yol.
Ripside

1
Sağ; "Anlambilim farklıdır" derken bunu kastettim.
Pointy
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.