Ada banyak cara nilai suatu <input type="text">
kaleng berubah, termasuk:
- tombol ditekan
- salin / tempel
- dimodifikasi dengan JavaScript
- otomatis dilengkapi oleh peramban atau bilah alat
Saya ingin fungsi JavaScript saya dipanggil (dengan nilai input saat ini) kapan saja ia berubah. Dan saya ingin segera dipanggil, tidak hanya ketika input kehilangan fokus.
Saya mencari cara paling bersih dan paling kuat untuk melakukan ini di semua browser (lebih baik menggunakan jQuery).
javascript
jquery
html
Dustin Boswell
sumber
sumber
Jawaban:
Kode jQuery ini menangkap perubahan langsung ke elemen apa pun, dan harus berfungsi di semua browser:
sumber
input
adalah acara HTML5 yang saya percaya harus mencakup semua browser modern ( referensi MDN ).keyup
harus menangkap sisanya, meskipun dengan sedikit penundaan (input
dipicu saat tombol turun).propertychange
adalah acara MS berpemilik, dan saya tidak yakin apakahpaste
itu benar-benar diperlukan.document.getElementById('txtInput').value = 'some text';
input
acara di sini menyatakan bahwa itu tidak menyala ketika kontennya diubah melalui JavaScript. Namun,onpropertychange
acara tersebut melakukan modifikasi terhadap modifikasi melalui JS (lihat di sini ). Jadi kode ini akan berfungsi ketika konten dimodifikasi melalui JS pada IE, tetapi tidak akan berfungsi pada browser lain.Solusi mewah waktu nyata untuk jQuery> = 1.9
jika Anda juga ingin mendeteksi acara "klik", cukup:
jika Anda menggunakan jQuery <= 1.4, gunakan saja
live
alih-alihon
.sumber
Sayangnya, saya pikir
setInterval
memenangkan hadiah:Ini solusi terbersih, hanya 1 baris kode. Ini juga yang paling kuat, karena Anda tidak perlu khawatir tentang semua peristiwa / cara yang berbeda yang
input
bisa mendapatkan nilai.Kelemahan menggunakan 'setInterval' tampaknya tidak berlaku dalam kasus ini:
sumber
Mengikat
oninput
acara tampaknya bekerja dengan baik di sebagian besar browser yang waras. IE9 mendukungnya juga, tetapi implementasinya buggy (acara tidak dipecat saat menghapus karakter).Dengan jQuery versi 1.7+
on
metode ini berguna untuk mengikat ke acara seperti ini:sumber
oninput
acara tidak berfungsi denganinput[type=reset]
atau mengedit javascript seperti yang Anda lihat dalam tes ini: codepen.io/yukulele/pen/xtEpbJawaban 2017 : acara input melakukan hal ini untuk sesuatu yang lebih baru dari IE8.
sumber
input
acara gagal mendeteksi perubahan JS.Sayangnya tidak ada acara atau rangkaian acara yang cocok dengan kriteria Anda. Tekan tombol dan salin / tempel keduanya dapat ditangani dengan
keyup
acara tersebut. Perubahan melalui JS lebih sulit. Jika Anda memiliki kendali atas kode yang mengatur kotak teks, taruhan terbaik Anda adalah memodifikasinya untuk langsung memanggil fungsi Anda atau memicu acara pengguna di kotak teks:Jika Anda tidak memiliki kendali atas kode itu, Anda bisa menggunakan
setInterval()
'melihat' kotak teks untuk perubahan:Pemantauan aktif semacam ini tidak akan menangkap pembaruan 'segera', tetapi tampaknya cukup cepat sehingga tidak ada kelambatan yang terlihat. Seperti yang ditunjukkan DrLouie dalam komentar, solusi ini mungkin tidak skala dengan baik jika Anda perlu menonton banyak input. Anda selalu dapat menyesuaikan parameter ke-2
setInterval()
untuk memeriksa lebih sering atau lebih sedikit.sumber
myTextBox.value = 'foo';
. Tidak ada peristiwa JavaScript yang menangani situasi itu.)input.onpropertychange
, dan FF2 +, Opera 9.5, Safari 3, dan Chrome 1 dapat mengatasinyainput.__defineSetter__('value', ...)
(yang, meskipun didokumentasikan tidak berfungsi pada node DOM, saya dapat memverifikasi berhasil). Satu-satunya perbedaan dari implementasi IE adalah IE meluncurkan handler tidak hanya pada pengaturan program tetapi juga selama acara-acara utama.Ini adalah solusi yang sedikit berbeda jika Anda tidak menyukai jawaban yang lain:
Pertimbangkan bahwa Anda tidak dapat mengandalkan klik dan keyup untuk mengambil tempel menu konteks.
sumber
$("input[id^=Units_]").each(function() {
Tambahkan kode ini di suatu tempat, ini akan melakukan trik.
Menemukan solusi ini di val () tidak memicu perubahan () di jQuery
sumber
Saya telah membuat sampel. Semoga ini berhasil untuk Anda.
http://jsfiddle.net/utbh575s/
sumber
Kami sebenarnya tidak perlu mengatur loop untuk mendeteksi perubahan javaScript. Kami sudah menyiapkan banyak pendengar acara untuk elemen yang ingin kami deteksi. hanya memicu peristiwa yang tidak berbahaya akan membuat pekerjaan.
dan ofc ini hanya tersedia jika Anda memiliki kontrol penuh pada perubahan javascript pada proyek Anda.
sumber
Nah, cara terbaik adalah menutupi ketiga pangkalan yang Anda daftarkan sendiri. Sederhana: onblur,: onkeyup, dll tidak akan berfungsi untuk apa yang Anda inginkan, jadi gabungkan saja.
KeyUp harus mencakup dua yang pertama, dan jika Javascript memodifikasi kotak input, saya harap ini javascript Anda sendiri, jadi tambahkan saja callback pada fungsi yang memodifikasinya.
sumber
Berikut ini adalah contoh kerja yang saya gunakan untuk mengimplementasikan variasi autocomplete yang mengisi pemilih jqueryui (daftar), tapi saya tidak ingin itu berfungsi persis seperti autocomplete jqueryui yang melakukan menu drop-down.
sumber
TANPA JQUERY! (Jenisnya sudah usang akhir-akhir ini)
Sunting: Saya menghapus acara HTML. JANGAN gunakan acara HTML ... alih-alih gunakan Javascript Event Listeners.
sumber
Tidak bisakah Anda menggunakan
<span contenteditable="true" spellcheck="false">
elemen saja<input type="text">
?<span>
(dengancontenteditable="true" spellcheck="false"
sebagai atribut) dibedakan<input>
terutama karena:<input>
.value
properti, tetapi teks itu dibuatinnerText
dan membuat bagian dari tubuhnya.<input>
bukan meskipun Anda mengatur atributmultiline="true"
.Untuk mencapai penampilan, tentu saja Anda bisa menata dalam CSS, sambil menuliskan nilai yang
innerText
Anda bisa dapatkan sebagai peristiwa:Ini biola .
Sayangnya ada sesuatu yang tidak benar-benar berfungsi di IE dan Edge, yang saya tidak dapat menemukannya.
sumber
Meskipun pertanyaan ini telah diposting 10 tahun yang lalu, saya percaya masih perlu beberapa perbaikan. Jadi, inilah solusi saya.
Satu-satunya masalah dengan solusi ini adalah, itu tidak akan memicu jika nilai berubah dari javascript suka
$('selector').val('some value')
. Anda dapat memecat suatu peristiwa ke pemilih Anda ketika Anda mengubah nilai dari javascript.sumber
Anda dapat melihat contoh ini dan memilih acara mana yang menarik minat Anda:
sumber
Saya mungkin terlambat ke pesta di sini, tetapi bisakah Anda tidak hanya menggunakan acara .change () yang disediakan jQuery.
Anda harus dapat melakukan sesuatu seperti ...
Anda selalu dapat mengikatnya ke daftar kontrol dengan sesuatu seperti ...
Pengikat langsung memastikan bahwa semua elemen yang ada di halaman sekarang dan di masa depan ditangani.
sumber
Ini adalah cara tercepat & bersih untuk melakukan itu:
Saya menggunakan Jquery ->
Ini bekerja cukup baik untuk saya.
sumber