Saya ingin memicu permintaan ajax ketika pengguna selesai mengetik dalam kotak teks. Saya tidak ingin menjalankan fungsi pada setiap kali pengguna mengetik surat karena itu akan menghasilkan BANYAK permintaan ajax, namun saya tidak ingin mereka harus menekan tombol enter juga.
Apakah ada cara agar saya bisa mendeteksi ketika pengguna selesai mengetik dan kemudian melakukan permintaan ajax?
Menggunakan jQuery di sini! Dave
javascript
jquery
keyboard
David Zorychta
sumber
sumber
Jawaban:
Jadi, saya akan menebak selesai mengetik berarti Anda hanya berhenti sebentar, katakan 5 detik. Maka dengan itu dalam pikiran, mari kita mulai waktu ketika pengguna melepaskan kunci dan menghapusnya ketika mereka menekan satu. Saya memutuskan input yang dimaksud adalah #myInput.
Membuat beberapa asumsi ...
sumber
doneTyping
dalam contoh, berjalan segera. Itu biasanya akibat tidak sengaja termasuk()
setelah nama fungsi. Perhatikan bahwa seharusnyasetTimeout(doneTyping,
tidak membacasetTimeout(doneTyping(),
Jawaban yang dipilih di atas tidak berfungsi.
Karena typingTimer kadang-kadang diatur beberapa kali (keyup ditekan dua kali sebelum keydown dipicu untuk pengetik cepat dll.) Maka itu tidak jelas dengan benar.
Solusi di bawah menyelesaikan masalah ini dan akan memanggil X detik setelah selesai sesuai permintaan OP. Itu juga tidak lagi membutuhkan fungsi keydown redundan. Saya juga telah menambahkan tanda centang sehingga panggilan fungsi Anda tidak akan terjadi jika input Anda kosong.
Dan kode yang sama dalam solusi vanilla JavaScript:
Solusi ini memang menggunakan ES6 tetapi tidak perlu di sini. Cukup ganti
let
denganvar
dan fungsi panah dengan fungsi biasa.sumber
$('#myInput').on('input', function() {
jika Anda ingin ini berfungsi dengan salin dan tempel. Saya tidak melihat titik cek jika input kosong. Misalkan dia ingin menghapus apa yang diketiknya ini akan gagal melakukan panggilan ajax.if ($('#myInput').val)
bukanif ($('#myInput').val())
? Haruskah.val
suatu fungsi?Ini hanya satu baris dengan fungsi debounce underscore.js :
Ini pada dasarnya mengatakan doSomething 500 milidetik setelah saya berhenti mengetik.
Untuk info lebih lanjut: http://underscorejs.org/#debounce
sumber
Uncaught ReferenceError: _ is not defined
Ya, Anda dapat mengatur batas waktu katakan 2 detik pada setiap dan setiap acara kunci yang akan memunculkan permintaan ajax. Anda juga dapat menyimpan metode XHR dan membatalkannya pada acara tekan tombol berikutnya sehingga Anda lebih menghemat bandwidth. Ini adalah sesuatu yang saya tulis untuk skrip pelengkapan otomatis saya.
Semoga ini membantu,
Marko
sumber
contoh lengkap di sini: http://jsfiddle.net/ZYXp4/8/
sumber
Kedua jawaban teratas tidak berfungsi untuk saya. Jadi, inilah solusi saya:
sumber
Saya menyukai jawaban Surreal Dream tetapi saya menemukan bahwa fungsi "doneTyping" saya akan menyala untuk setiap penekanan tombol, yaitu jika Anda mengetik "Halo" dengan sangat cepat; alih-alih menembak hanya sekali ketika Anda berhenti mengetik, fungsi akan menyala 5 kali.
Masalahnya adalah bahwa fungsi setTimeout javascript tampaknya tidak menimpa atau membunuh semua timeout lama yang telah ditetapkan, tetapi jika Anda melakukannya sendiri berfungsi! Jadi saya baru saja menambahkan panggilan clearTimeout tepat sebelum setTimeout jika typingTimer diatur. Lihat di bawah:
NB Saya ingin menambahkan ini sebagai komentar untuk jawaban Surreal Dream tapi saya pengguna baru dan tidak memiliki reputasi yang cukup. Maaf!
sumber
Memodifikasi jawaban yang diterima untuk menangani kasus tambahan seperti tempel:
sumber
Saya tidak berpikir acara keyDown diperlukan dalam kasus ini (tolong katakan padaku mengapa jika saya salah). Dalam skrip saya (non-jquery) solusi yang serupa terlihat seperti itu:
Ini balasan pertama saya di Stack Overflow, jadi saya harap ini membantu seseorang, suatu hari nanti :)
sumber
Nyatakan
delay
fungsi berikut :dan kemudian menggunakannya:
sumber
Jawaban yang terlambat tetapi saya menambahkannya karena ini tahun 2019 dan ini sepenuhnya dapat dicapai dengan menggunakan ES6 yang cantik, tidak ada perpustakaan pihak ketiga, dan saya menemukan sebagian besar jawaban berperingkat sangat besar dan terbebani dengan terlalu banyak variabel.
Solusi elegan diambil dari posting blog yang luar biasa ini.
sumber
Yah, sebenarnya tidak, karena komputer tidak dapat menebak kapan pengguna selesai mengetik. Anda tentu saja dapat mengaktifkan timer pada tombol atas, dan mengatur ulang pada setiap tombol berikutnya ke atas. Jika penghitung waktu kedaluwarsa, pengguna belum mengetik untuk jangka waktu - Anda bisa menyebutnya "selesai mengetik".
Jika Anda mengharapkan pengguna membuat jeda saat mengetik, tidak ada cara untuk mengetahui kapan mereka selesai.
(Kecuali tentu saja Anda dapat mengetahui dari data ketika mereka selesai)
sumber
Saya merasa solusinya sedikit lebih sederhana dengan
input
acara ini:sumber
setuju dengan jawaban @ going. Solusi serupa lainnya yang berhasil bagi saya adalah solusi di bawah ini. Satu-satunya perbedaan adalah bahwa saya menggunakan .on ("input" ...) alih-alih keyup. Ini hanya menangkap perubahan pada input. tombol lain seperti Ctrl, Shift dll diabaikan
sumber
Saya baru saja menemukan kode sederhana untuk menunggu pengguna selesai mengetik:
langkah 1.set time out ke null lalu hapus timeout saat ini saat pengguna mengetik.
langkah 2.trigger timeout yang jelas ke variabel define sebelum peristiwa keyup dipicu.
langkah 3. tentukan batas waktu untuk variabel yang dinyatakan di atas;
kode javascript
sumber
Saya sedang menerapkan pencarian di daftar saya dan membutuhkannya untuk berbasis ajax. Itu berarti bahwa pada setiap perubahan kunci, hasil yang dicari harus diperbarui dan ditampilkan. Ini menghasilkan begitu banyak panggilan ajax yang dikirim ke server, yang bukan hal yang baik.
Setelah beberapa bekerja, saya membuat pendekatan untuk melakukan ping ke server ketika pengguna berhenti mengetik.
Solusi ini bekerja untuk saya:
Anda akan melihat bahwa tidak perlu menggunakan timer saat menerapkan ini.
sumber
Ini adalah kode JS sederhana yang saya tulis:
sumber
Anda dapat menggunakan acara onblur untuk mendeteksi ketika kotak teks kehilangan fokus: https://developer.mozilla.org/en/DOM/element.onblur
Itu tidak sama dengan "berhenti mengetik", jika Anda peduli tentang kasus di mana pengguna mengetik banyak barang dan kemudian duduk di sana dengan kotak teks masih fokus.
Untuk itu saya akan menyarankan untuk mengikat setTimeout ke acara onclick, dan dengan asumsi bahwa setelah x jumlah waktu tanpa penekanan tombol, pengguna telah berhenti mengetik.
sumber
Mengapa tidak menggunakan fokus saja?
https://www.w3schools.com/jsreF/event_onfocusout.asp
Jika itu bentuk, mereka akan selalu meninggalkan fokus setiap bidang input untuk mengklik tombol kirim sehingga Anda tahu tidak ada input yang akan ketinggalan untuk mendapatkan penangan event onfocusout yang dipanggil.
sumber
Jika ada keharusan bagi pengguna untuk menjauh dari bidang, kita dapat menggunakan "onBlur" alih-alih Onchange dalam Javascript
Jika itu tidak diperlukan, pengaturan timer akan menjadi pilihan yang baik.
sumber
Setelah Anda mendeteksi fokus pada kotak teks, pada tombol lakukan pemeriksaan batas waktu, dan reset setiap kali itu dipicu.
Ketika batas waktu selesai, lakukan permintaan ajax Anda.
sumber
Jika Anda mencari panjang tertentu (seperti bidang kode pos):
sumber
Tidak yakin apakah kebutuhan saya agak aneh, tetapi saya membutuhkan sesuatu yang mirip dengan ini dan inilah yang akhirnya saya gunakan:
Yang memungkinkan saya untuk memiliki elemen seperti ini di aplikasi saya:
Yang diperbarui ketika pengguna "selesai mengetik" (tidak ada tindakan selama 2 detik) atau pergi ke bidang lain (kabur dari elemen)
sumber
Jika Anda perlu menunggu sampai pengguna selesai mengetik, gunakan ini:
Contoh lengkap dengan panggilan ajax - ini berfungsi untuk pager saya - jumlah item per daftar:
sumber
Banyak penghitung waktu per halaman
Semua jawaban lain hanya berfungsi untuk satu kontrol ( termasuk jawaban saya yang lain ). Jika Anda memiliki beberapa kontrol per halaman (misalnya dalam keranjang belanja) hanya kontrol terakhir tempat pengguna mengetik sesuatu yang akan dipanggil . Dalam kasus saya ini tentu bukan perilaku yang diinginkan - setiap kontrol harus memiliki timer sendiri.
Untuk mengatasi ini, Anda hanya perlu memberikan ID ke fungsi dan mempertahankan kamus timeoutHandles seperti dalam kode berikut:
Deklarasi Fungsi:
Penggunaan fungsi:
sumber
Sederhana dan mudah dimengerti.
sumber
Untuk melewatkan parameter ke fungsi Anda bersama dengan sintaks ES6.
sumber
Wow, bahkan 3 komentar cukup benar!
Input kosong bukan alasan untuk melewatkan panggilan fungsi, misalnya saya menghapus parameter limbah dari url sebelum dialihkan
.on ('input', function() { ... });
harus digunakan untuk memicukeyup
,paste
danchange
acarapasti
.val()
atau.value
harus digunakanAnda dapat menggunakan
$(this)
fungsi acara di dalam alih-alih#id
bekerja dengan beberapa input(keputusan saya) saya menggunakan fungsi anonim bukannya
doneTyping
disetTimeout
mudah akses$(this)
dari n.4, tetapi Anda harus menyimpannya terlebih dahulu sepertivar $currentInput = $(this);
EDIT Saya melihat bahwa beberapa orang tidak mengerti arah tanpa kemungkinan untuk menyalin-rekatkan kode siap. Di sini kamu
sumber
paste
, tidak digunakanthis
, dll. (Saya pikir ini penting tapi saya tidak ingin tersesat dalam banyak komentar)