jQuery mendapatkan nilai input setelah tombol ditekan

129

Saya memiliki fungsi berikut:

$(document).ready(function() {
    $("#dSuggest").keypress(function() {
        var dInput = $('input:text[name=dSuggest]').val();
        console.log(dInput);
        $(".dDimension:contains('" + dInput + "')").css("display","block");
    });
});

Untuk beberapa alasan, untuk penekanan tombol pertama, saya mendapatkan string kosong ke log konsol.

Atau Weinberger
sumber

Jawaban:

157

Ini karena keypressperistiwa dipecat sebelum karakter baru ditambahkan ke valueelemen (jadi keypressacara pertama dipecat sebelum karakter pertama ditambahkan, sementara valuemasih kosong). Anda sebaiknya menggunakan keyup, yang dipecat setelah karakter ditambahkan.

Perhatikan bahwa, jika elemen Anda #dSuggestsama dengan input:text[name=dSuggest]menyederhanakan kode ini (dan jika tidak, memiliki elemen dengan nama yang sama dengan idelemen lain bukanlah ide yang baik).

$('#dSuggest').keypress(function() {
    var dInput = this.value;
    console.log(dInput);
    $(".dDimension:contains('" + dInput + "')").css("display","block");
});
lonesomeday
sumber
2
Berfungsi, tetapi dengan jquery 2.x keluar ini sudah ketinggalan zaman sekarang karena jawaban di bawah ini menggunakan on dan input adalah cara terbaik untuk melakukannya sekarang.
Piotr Kula
1
@ppumkin: Hanya karena jQuery 2 keluar, tidak berarti orang tidak perlu mendukung IE8 dan lebih rendah. Dan saya tidak melihat apa pun di dokumen yang menunjukkan dukungan aktual untuk inputjenis acara.
cookie monster
7
Anda benar, mereka harus berhenti mendukung IE, titik. Kebanyakan "solusi" di jQuery 1.x adalah untuk IE, jadi itu harus benar-benar diganti namanya menjadi jQuerIE.
Piotr Kula
189

Menyadari bahwa ini adalah posting yang agak lama, saya tetap akan memberikan jawaban karena saya masih berjuang dengan masalah yang sama.

Anda harus menggunakan "input"acara sebagai gantinya, dan mendaftar dengan .onmetode ini. Ini cepat - tanpa lag keyupdan menyelesaikan masalah penekanan tombol terbaru yang Anda uraikan.

$('#dSuggest').on("input", function() {
    var dInput = this.value;
    console.log(dInput);
    $(".dDimension:contains('" + dInput + "')").css("display","block");
});

Demo di sini

Frederik Gottlieb
sumber
26
Ini harus ditandai sebagai jawaban yang tepat - keyup mungkin memecahkan masalah karakter yang hilang, tetapi bermasalah untuk menentukan apakah karakter benar-benar ditulis (dan kuncinya bukan misalnya "tab" atau "home"). +1 untuk Anda
Nashi
Masalahnya adalah itu tidak didukung di browser lama dan IE9 tidak menanggapi karakter yang dihapus.
PhoneixS
33

Gunakan .keyupbukan penekanan tombol.

Juga gunakan $(this).val()atau hanya this.valueuntuk mengakses nilai input saat ini.

DEMO di sini

Info tentang .keypressdari jQuery docs,

Acara penekanan tombol dikirim ke elemen ketika browser mendaftarkan input keyboard. Ini mirip dengan acara keydown, kecuali dalam kasus pengulangan kunci. Jika pengguna menekan dan menahan tombol, peristiwa keydown dipicu sekali, tetapi peristiwa penekanan tombol terpisah dipicu untuk setiap karakter yang dimasukkan. Selain itu, tombol pengubah (seperti Shift) memicu peristiwa keydown tetapi tidak menekan tombol.

Selvakumar Arumugam
sumber
5
keyupterlalu lambat, dan kunci dapat ditekan dan ditahan tanpa dilepaskan dan hal-hal harus terjadi. lebih baik digunakan keydowndengan sedikit batas waktu sehingga nilainya benar-benar berubah.
vsync
satu-satunya kelemahan yang saya temukan adalah bahwa jika pengguna menekan lebih dari satu karakter keyboard secara bersamaan, itu tidak akan mendaftar dengan benar.
vsync
5

Anda harus menghentikan utas eksekusi untuk memungkinkan input diperbarui.

  $(document).ready(function(event) {
       $("#dSuggest").keypress(function() {
           //Interrupt the execution thread to allow input to update
               setTimeout(function() {
                   var dInput = $('input:text[name=dSuggest]').val();
                   console.log(dInput);
                   $(".dDimension:contains('" + dInput + "')").css("display","block");
               }, 0);
       });
  });
parlemen
sumber
1
keyupketerlambatan terlalu lambat untuk beberapa tujuan, dan juga tidak kunci filter auto-filter modifier. Ini sebenarnya bekerja lebih baik untuk saya.
Albert Bori
jawaban Terbaik. keyup - lambat dan tidak bisa menangkap karakter seperti @ dengan dua tombol ditekan.
Roma Rush
4

Ini karena Keypressacara dipecat sebelum karakter baru ditambahkan. Gunakan acara 'keyup' sebagai gantinya, yang akan bekerja dengan sempurna dalam situasi Anda.

$(document).ready(function() {
    $("#dSuggest").keyup(function() {
        var dInput = $('input:text[name=dSuggest]').val();
        console.log(dInput);
        $(".dDimension:contains('" + dInput + "')").css("display","block");
    });
});

Saya ingin menambahkan ini, jika Anda memiliki banyak kotak teks dan Anda harus melakukan hal yang sama pada acara keyup Anda, Anda bisa memberi mereka kelas css umum (misalnya commoncss) dan menerapkan event keyup seperti ini.

$(document).ready(function() {
    $(".commoncss").keyup(function() {
        //your code
    });
});

ini akan sangat mengurangi kode Anda karena Anda tidak harus menerapkan acara keyup oleh id untuk setiap kotak teks.

yogihosting
sumber
3

Saya sedang mencari contoh ES6 (sehingga bisa melewati linter saya) Jadi untuk orang lain yang mencari yang sama:

$('#dSuggest').keyup((e) => {
    console.log(e.currentTarget.value);
});

Saya juga akan menggunakan keyup karena Anda mendapatkan nilai saat ini yang diisi.

MarvinVK
sumber
1

Cukup gunakan batas waktu untuk melakukan panggilan Anda; batas waktu akan dipanggil ketika tumpukan acara selesai (yaitu setelah acara standar dipanggil)

$("body").on('keydown', 'input[type=tel]', function (e) {
    setTimeout(() => {
        formatPhone(e)
    }, 0)
});
Smonge
sumber
0

Saya pikir yang Anda butuhkan adalah prototipe di bawah ini

$(element).on('input',function(){code})
Zuckerberg
sumber
0

jQuery mendapatkan nilai input setelah tombol ditekan

https://www.tutsmake.com/jquery-keypress-event-detect-enter-key-pressed/

i = 0;  
$(document).ready(function(){  
    $("input").keypress(function(){  
        $("span").text (i += 1);  
    });  
}); 
<!DOCTYPE html>  
<html>  
<head>  
<title>jQuery keyup() Method By Tutsmake Example</title> 
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>  
<body>  
Enter something: <input type="text">  
<p>Keypresses val count: <span>0</span></p>  
</body>  
</html>  

Pengembang
sumber