Saya ingin mendeteksi kapan konten kotak teks telah berubah. Saya dapat menggunakan metode keyup, tetapi itu juga akan mendeteksi penekanan tombol yang tidak menghasilkan huruf, seperti tombol panah. Saya memikirkan dua metode untuk melakukan ini menggunakan peristiwa keyup:
- Periksa dengan jelas apakah kode ascii dari tombol yang ditekan adalah huruf \ backspace \ delete
- Gunakan closure untuk mengingat teks apa yang ada di kotak teks sebelum tombol stroke dan periksa apakah ini sudah berubah.
Keduanya terlihat agak rumit.
javascript
jquery
textbox
keypress
olamundo
sumber
sumber
.keyup()
acara ... info lebih lanjut di sini: stackoverflow.com/questions/3003879/….change()
jika telah berubah.Jawaban:
Mulai amati acara 'masukan' alih-alih 'ubah'.
... yang bagus dan bersih, tetapi dapat diperpanjang ke:
sumber
Gunakan acara pertukaran dalam HTML / JavaScript standar.
Di jQuery itu adalah perubahan () acara. Sebagai contoh:
$('element').change(function() { // do something } );
EDIT
Setelah membaca beberapa komentar, bagaimana dengan:
sumber
Acara 'perubahan' tidak berfungsi dengan benar, tetapi 'input' sempurna.
sumber
.on
direkomendasikan dari 1,7 dan seterusnya (daripada.bind
).Bagaimana dengan ini:
<jQuery 1.7
> jQuery 1.7
Ini berfungsi di IE8 / IE9, FF, Chrome
sumber
console.log
nilai dari bidang itu log dua kali setiap kali Anda memasukkan karakter.Ya. Anda tidak harus menggunakan penutupan, tetapi Anda harus mengingat nilai lama dan membandingkannya dengan yang baru.
Namun! Ini masih tidak akan menangkap setiap perubahan, karena ada cara mengedit konten kotak teks yang tidak melibatkan penekanan tombol apa pun. Misalnya memilih rentang teks kemudian klik kanan-potong. Atau menyeretnya. Atau menjatuhkan teks dari aplikasi lain ke dalam kotak teks. Atau mengubah kata melalui periksa ejaan browser. Atau...
Jadi, jika Anda harus mendeteksi setiap perubahan, Anda harus memilihnya. Anda bisa
window.setInterval
memeriksa bidang terhadap nilai sebelumnya setiap (katakanlah) detik. Anda juga bisa kawatonkeyup
untuk fungsi yang sama sehingga perubahan yang berada disebabkan oleh penekanan tombol tercermin lebih cepat.Rumit? Iya. Tapi begitulah atau lakukan saja cara pertukaran HTML biasa dan jangan mencoba untuk memperbarui secara instan.
sumber
input
acara HTML5 layak dan bekerja di versi terbaru dari semua browser utama.Anda dapat menggunakan acara 'input' untuk mendeteksi perubahan konten di kotak teks. Jangan gunakan 'live' untuk mengikat acara karena sudah usang di Jquery-1.7, Jadi manfaatkan 'on'.
sumber
Saya berasumsi bahwa Anda mencari untuk melakukan sesuatu yang interaktif ketika kotak teks berubah (yaitu mengambil beberapa data melalui ajax). Saya mencari fungsi yang sama ini. Saya tahu menggunakan global bukan solusi yang paling kuat atau elegan, tapi itulah yang saya lakukan. Berikut ini sebuah contoh:
Satu hal penting yang perlu diperhatikan di sini adalah bahwa saya menggunakan setTimeout dan tidak mengaturInterval karena saya tidak ingin mengirim beberapa permintaan sekaligus. Ini memastikan bahwa penghitung waktu "berhenti" ketika formulir dikirimkan dan "dimulai" saat permintaan selesai. Saya melakukan ini dengan memanggil checkSearchChanged ketika panggilan ajax saya selesai. Jelas Anda dapat memperluas ini untuk memeriksa panjang minimum, dll.
Dalam kasus saya, saya menggunakan ASP.Net MVC sehingga Anda dapat melihat cara mengikat ini dengan MVC Ajax juga di posting berikut:
http://geekswithblogs.net/DougLampe/archive/2010/12/21/simple-interactive-search-with-jquery-and-asp.net-mvc.aspx
sumber
Saya akan merekomendasikan untuk melihat widget autocomplete jQuery UI. Mereka menangani sebagian besar kasus di sana karena basis kode mereka lebih matang daripada kebanyakan di luar sana.
Di bawah ini adalah tautan ke halaman demo sehingga Anda dapat memverifikasinya berfungsi. http://jqueryui.com/demos/autocomplete/#default
Anda akan mendapatkan manfaat paling banyak dari membaca sumber dan melihat bagaimana mereka menyelesaikannya. Anda dapat menemukannya di sini: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js .
Pada dasarnya mereka melakukan semuanya, mereka mengikat
input, keydown, keyup, keypress, focus and blur
. Kemudian mereka memiliki penanganan khusus untuk semua jenis kunci sepertipage up, page down, up arrow key and down arrow key
. Penghitung waktu digunakan sebelum mendapatkan isi dari kotak teks. Ketika pengguna mengetik kunci yang tidak sesuai dengan perintah (tombol atas, tombol bawah dan sebagainya) ada timer yang mengeksplorasi konten setelah sekitar 300 milidetik. Sepertinya ini dalam kode:Alasan untuk menggunakan timer adalah agar UI mendapat kesempatan untuk diperbarui. Ketika Javascript sedang berjalan, UI tidak dapat diperbarui, oleh karena itu panggilan ke fungsi penundaan. Ini berfungsi dengan baik untuk situasi lain seperti menjaga fokus pada kotak teks (digunakan oleh kode itu).
Jadi Anda bisa menggunakan widget atau menyalin kode ke widget Anda sendiri jika Anda tidak menggunakan jQuery UI (atau dalam kasus saya mengembangkan widget khusus).
sumber
Saya ingin bertanya mengapa Anda mencoba mendeteksi ketika konten kotak teks berubah secara real time ?
Alternatifnya adalah dengan mengatur timer (via setIntval?) Dan membandingkan nilai yang terakhir disimpan dengan yang sekarang dan kemudian reset timer. Ini akan menjamin menangkap perubahan APAPUN, baik yang disebabkan oleh tombol, mouse, beberapa perangkat input lain yang tidak Anda pertimbangkan, atau bahkan JavaScript yang mengubah nilainya (kemungkinan lain yang tidak disebutkan) dari bagian aplikasi yang berbeda.
sumber
apakah Anda mempertimbangkan untuk menggunakan acara perubahan ?
sumber
Gunakan
textchange
acara tersebut melalui jQuery shim yang disesuaikan untukinput
kompatibilitas lintas-browser . http://benalpert.com/2013/06/18/a-near-perfect-oninput-shim-for-ie-8-and-9.html (paling baru bercabang github: https://github.com/pandell /jquery-splendid-textchange/blob/master/jquery.splendid.textchange.js )Ini menangani semua tag input termasuk
<textarea>content</textarea>
, yang tidak selalu berfungsi dengan baikchange
keyup
dll. (!) Hanya jQuery yangon("input propertychange")
menangani<textarea>
tag secara konsisten, dan di atas adalah shim untuk semua browser yang tidak mengertiinput
acara.Tes JS Bin
Ini juga menangani tempel, hapus, dan tidak menduplikasi upaya pada keyup.
Jika tidak menggunakan shim, gunakan
on("input propertychange")
acara jQuery .sumber
Ada contoh kerja yang lengkap di sini .
sumber
Sesuatu seperti ini seharusnya bekerja, terutama karena
focus
danfocusout
akan berakhir dengan dua nilai yang terpisah. Saya menggunakan didata
sini karena menyimpan nilai dalam elemen tetapi tidak menyentuh DOM. Ini juga merupakan cara mudah untuk menyimpan nilai yang terhubung ke elemennya. Anda bisa dengan mudah menggunakan variabel dengan cakupan yang lebih tinggi.sumber
Kode ini mendeteksi setiap kali konten kotak teks telah diubah oleh pengguna dan dimodifikasi oleh kode Javascript.
sumber