Mendeteksi perubahan input di jQuery?

360

Saat menggunakan jquery .changepada suatu inputacara hanya akan dipecat ketika input kehilangan fokus

Dalam kasus saya, saya perlu melakukan panggilan ke layanan (periksa apakah nilainya valid) segera setelah nilai input diubah. Bagaimana saya bisa mencapai ini?

Banshee
sumber
3
input apa? kotak teks? kotak centang? radio? textarea? mari kita lihat apa yang telah Anda buat sejauh ini
Patricia
Maaf, ini adalah input teks jenis. Dan seperti yang saya katakan, saya telah mencoba perubahan tetapi ini tidak memadamkan yang saya butuhkan (untuk setiap perubahan pada teks dalam input). Saya juga sudah mencoba keydown tetapi untuk membuatnya bekerja, saya harus tetap melacak apakah inputnya "kotor" atau tidak.
Banshee
2
jika mereka menekan tombol, itu akan berubah 99% dari waktu, Anda selalu bisa melakukan pemeriksaan untuk kunci yang tidak ada dalam event handler.
Patricia

Jawaban:

546

DIPERBARUI untuk klarifikasi dan contoh

contoh: http://jsfiddle.net/pxfunc/5kpeJ/

Metode 1. inputacara

Di browser modern gunakan inputacara tersebut. Acara ini akan diaktifkan saat pengguna mengetik ke bidang teks, menempelkan, membatalkan, pada dasarnya kapan saja nilai berubah dari satu nilai ke nilai lain.

Di jQuery lakukan itu seperti ini

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

dimulai dengan jQuery 1.7, ganti binddengan on:

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

Metode 2. keyupacara

Untuk browser lama gunakan keyupacara (ini akan menyala setelah tombol pada keyboard telah dirilis, acara ini dapat memberikan semacam false positive karena ketika "w" dirilis nilai input diubah dan keyupacara menyala, tetapi juga ketika Tombol "shift" dilepaskan saat keyupkebakaran terjadi tetapi tidak ada perubahan yang dilakukan pada input.) Metode ini juga tidak memecat jika pengguna mengklik kanan dan menempelkan dari menu konteks:

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

Metode 3. Timer ( setIntervalatau setTimeout)

Untuk menyiasati keterbatasan keyupAnda dapat mengatur timer untuk secara berkala memeriksa nilai input untuk menentukan perubahan nilai. Anda dapat menggunakan setIntervalatau setTimeoutmelakukan pemeriksaan pengatur waktu ini. Lihat jawaban yang ditandai pada pertanyaan SO ini: jQuery mengubah acara teks atau melihat biola untuk contoh kerja menggunakan focusdan bluracara untuk memulai dan menghentikan timer untuk bidang input tertentu

MikeM
sumber
Bisakah Anda menjelaskan lebih lanjut tentang solusi ini? Bagaimana cara saya mendapatkan nilai saat ini? Bagaimana cara menjalankan ini hanya jika perubahan dilakukan ke nilai saat ini?
Banshee
masukan acara? tidak ada input event di jQuery (belum) ... stackoverflow.com/q/11189136/104380
vsync
Untuk metode 2 saya biasanya mengikat keyup dan perubahan. Dengan cara itu dalam situasi di mana input terjadi tanpa penekanan tombol (seperti menempel) setidaknya akan memunculkan event ketika input kehilangan fokus.
rspeed
1
@AdiDarachi MutationObserver akan melacak perubahan pada elemen DOM. Namun, pengguna yang mengubah data dalam bidang input tidak memicu perubahan MutationObserver ... Saya menyiapkan kasus uji, hanya perubahan kode JS ke atribut innerTextatau value(mensimulasikan input pengguna) yang akan memicu peristiwa MutationObserver jsfiddle.net/pxfunc/ 04chgpws / 1 (lihat console.log untuk pendataan acara MutationObserver). Apakah Anda memiliki test case yang berbeda yang dapat saya lihat?
MikeM
1
ini tidak berfungsi saat skrip mengubah nilai
FalcoGer
189

Jika Anda punya HTML5:

  • oninput (Kebakaran hanya ketika perubahan benar-benar terjadi, tetapi segera melakukannya)

Jika tidak, Anda perlu memeriksa semua peristiwa ini yang mungkin mengindikasikan perubahan pada nilai elemen input:

  • onchange
  • onkeyup( belum keydown atau keypresskarena nilai input belum memiliki penekanan tombol baru di dalamnya)
  • onpaste (ketika didukung)

dan mungkin:

  • onmouseup (Saya tidak yakin tentang ini)
Alnitak
sumber
@naomik dari pengujian saya berfungsi untuk input kotak centang; kecuali IE / Edge. Beberapa pengecualian lain mungkin muncul, tetapi lebih pintar untuk menggunakan pertukaran untuk tipe input tersebut (IMHO).
HellBaby
82

Dengan HTML5 dan tanpa menggunakan jQuery, Anda dapat menggunakan inputacara :

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

Ini akan menyala setiap kali teks input berubah.

Didukung di IE9 + dan browser lainnya.

Cobalah langsung di jsFiddle di sini .

Drew Noakes
sumber
1
'ubah' hanya menyala blur, bukan saat teks berubah. Gunakan acara 'input' untuk mendeteksi perubahan teks.
Dermot Doherty
14

Seperti yang sudah disarankan orang lain, solusi dalam kasus Anda adalah mengendus beberapa peristiwa .
Pengaya yang melakukan pekerjaan ini sering mendengarkan acara berikut:

$ input . on ( 'ubah keydown tombol tekan tombol mouse mouse klik mouse' , handler );

Jika menurut Anda itu cocok, Anda dapat menambahkan focus , blurdan acara lainnya juga.
Saya menyarankan untuk tidak melebihi dalam acara untuk mendengarkan, karena memuat dalam memori browser prosedur lebih lanjut untuk mengeksekusi sesuai dengan perilaku pengguna.

Perhatian: perhatikan bahwa mengubah nilai elemen input dengan JavaScript (mis. Melalui .val()metode jQuery ) tidak akan memecat salah satu peristiwa di atas.
(Referensi: https://api.jquery.com/change/ ).

Emanuele Del Grande
sumber
saya juga merekomendasikan untuk menambahkan fokus untuk menghindari masalah dengan autocomplete
binar
Saya melihat. Saya mencari, dan fokus keluar tampaknya hanya didukung oleh IE dan sebagian oleh Chrome, apakah saya benar?
Emanuele Del Grande
5
Sama seperti tambahan ringan, Untuk memecat acara dari jQuery Anda dapat memanggil tindakan yang sesuai setelah .val()misalnya untuk acara perubahan pada bidang input, Anda akan melakukan sesuatu seperti ini ... $('#element').val(whatever).change()
techknowcrat
2

Jika Anda ingin acara dipecat setiap kali ada perubahan dalam elemen maka Anda bisa menggunakan acara keyup .

Jivings
sumber
Oke tapi apakah ini kurang lebih sama dengan keydown? Saya harus memeriksa sendiri apakah inputnya "kotor"?
Banshee
@SnowJim jika Anda hanya ingin melakukan hal-hal ketika input benar-benar berubah, Anda harus menggunakan onchange, atau melacak negara sendiri. keydowntidak berfungsi karena menyala sebelum kondisi input diubah.
Alnitak
@Alnitak tepat dan itulah mengapa saya mengajukan pertanyaan di sini. Pertukaran tidak berfungsi, apakah hanya dibuang saat meninggalkan input.
Banshee
Gajah di kamar tentu saja bergerak. Cukup yakin tidak ada acara keyboard atau mouse akan banyak berguna di sana. : p
Askdesigners
@Askdesigners Peristiwa keyup / down masih bisa berjalan dengan cara yang sama di ponsel.
Jivings
2

// .blur dipicu saat elemen kehilangan fokus

$('#target').blur(function() {
  alert($(this).val());
});

// Untuk memicu secara manual gunakan:

$('#target').blur();
Kszili
sumber
1
.change adalah seperti yang saya katakan hanya dilemparkan ketika inout kehilangan fokus dan nilainya berubah, saya perlu mendapatkan bahkan segera setelah input (teks) diubah (segera setelah teks dalam input diubah). Blur hanya akan memicu ketika input kehilangan fokus.
Banshee
1

Ada acara jQuery seperti keyup dan penekanan tombol yang dapat Anda gunakan dengan masukan Elemen HTML. Anda juga bisa menggunakan acara blur () .

pengembang perangkat lunak
sumber
1
.change adalah seperti yang saya katakan hanya dilemparkan ketika inout kehilangan fokus dan nilainya berubah, saya perlu mendapatkan bahkan segera setelah input (teks) diubah (segera setelah teks dalam input diubah). Blur hanya akan memicu ketika input kehilangan fokus.
Banshee
1
Anda tidak dapat secara andal memeriksa nilai input selama keypressacara karena tombol yang ditekan belum akan mengubah nilai itu.
Alnitak
0

Ini mencakup setiap perubahan pada input menggunakan jQuery 1.7 ke atas:

$(".inputElement").on("input", null, null, callbackFunction);
rybo111
sumber