Saya punya bidang pencarian. Saat ini ia mencari setiap keyup. Jadi jika seseorang mengetik "Windows", itu akan melakukan pencarian dengan AJAX untuk setiap keyup: "W", "Wi", "Win", "Wind", "Windo", "Window", "Windows".
Saya ingin menunda, jadi hanya mencari ketika pengguna berhenti mengetik untuk 200 ms.
Tidak ada opsi untuk ini dalam keyup
fungsi, dan saya sudah mencoba setTimeout
, tetapi tidak berhasil.
Bagaimana saya bisa melakukan itu?
javascript
jquery
ajsie
sumber
sumber
Jawaban:
Saya menggunakan fungsi kecil ini untuk tujuan yang sama, menjalankan fungsi setelah pengguna berhenti mengetik untuk jumlah waktu tertentu atau dalam peristiwa yang memecat pada tingkat tinggi, seperti
resize
:Bagaimana itu bekerja:
The
delay
fungsi akan mengembalikan fungsi dibungkus bahwa secara internal menangani timer individu, di setiap eksekusi timer-restart dengan waktu tunda yang disediakan, jika beberapa eksekusi terjadi sebelum waktu ini berlalu, timer hanya akan mengatur ulang dan mulai lagi.Ketika penghitung waktu akhirnya berakhir, fungsi panggilan balik dieksekusi, melewati konteks dan argumen asli (dalam contoh ini, objek acara jQuery, dan elemen DOM sebagai
this
).UPDATE 2019-05-16
Saya telah mengimplementasikan kembali fungsi menggunakan fitur ES5 dan ES6 untuk lingkungan modern:
Implementasi ditutup dengan serangkaian tes .
Untuk sesuatu yang lebih canggih, lihat plugin jQuery Typewatch .
sumber
Jika Anda ingin mencari setelah jenis selesai gunakan variabel global untuk menahan batas waktu kembali dari
setTimout
panggilan Anda dan membatalkannya denganclearTimeout
jika belum terjadi sehingga tidak akan memadamkan batas waktu kecuali padakeyup
acara terakhirAtau dengan fungsi anonim:
sumber
Peningkatan kecil lain pada jawaban CMS. Untuk memudahkan penundaan yang terpisah, Anda dapat menggunakan yang berikut:
Jika Anda ingin menggunakan kembali penundaan yang sama, lakukan saja
Jika Anda ingin penundaan terpisah, Anda dapat melakukannya
sumber
someApiCall
masih memicu beberapa kali - sekarang hanya dengan nilai akhir dari bidang input.Anda juga dapat melihat underscore.js , yang menyediakan metode utilitas seperti debounce :
sumber
Berdasarkan jawaban CMS, saya membuat ini:
Masukkan kode di bawah ini setelah menyertakan jQuery:
Dan cukup gunakan seperti ini:
Hati-hati: variabel $ (ini) pada fungsi yang diteruskan sebagai parameter tidak cocok dengan input
sumber
Tunda Panggilan Multi Fungsi menggunakan Label
Ini adalah solusi yang saya kerjakan. Ini akan menunda eksekusi pada fungsi APAPUN yang Anda inginkan . Ini bisa berupa permintaan pencarian keydown, mungkin klik cepat pada tombol sebelumnya atau berikutnya (yang sebaliknya akan mengirim beberapa permintaan jika diklik dengan cepat terus menerus, dan tidak digunakan sama sekali). Ini menggunakan objek global yang menyimpan setiap waktu eksekusi, dan membandingkannya dengan permintaan terbaru.
Jadi hasilnya adalah hanya klik / tindakan terakhir yang akan dipanggil, karena permintaan tersebut disimpan dalam antrian, setelah X milidetik dipanggil jika tidak ada permintaan lain dengan label yang sama ada di antrian!
Anda dapat mengatur waktu tunda Anda sendiri (opsional, default ke 500 ms). Dan kirim argumen fungsi Anda dalam "mode penutupan".
Misalnya jika Anda ingin memanggil fungsi di bawah ini:
Untuk mencegah beberapa permintaan send_ajax, Anda menunda menggunakan:
delay_method( "check date", function(){ send_ajax(2); } ,600);
Setiap permintaan yang menggunakan label "tanggal cek" hanya akan dipicu jika tidak ada permintaan lain yang dibuat dalam jangka waktu 600 milidetik. Argumen ini opsional
Label independensi (memanggil fungsi target yang sama) tetapi jalankan keduanya:
Hasilnya memanggil fungsi yang sama tetapi menunda mereka secara independen karena label mereka berbeda
sumber
Jika seseorang suka menunda fungsi yang sama, dan tanpa variabel eksternal ia dapat menggunakan skrip berikutnya:
sumber
Pendekatan super sederhana, dirancang untuk menjalankan fungsi setelah pengguna selesai mengetik dalam bidang teks ...
sumber
Fungsi ini sedikit memperluas fungsi dari jawaban Gaten untuk mendapatkan elemen kembali:
http://jsfiddle.net/Us9bu/2/
sumber
Saya terkejut bahwa tidak ada yang menyebutkan masalah dengan beberapa input di CMS yang sangat bagus.
Pada dasarnya, Anda harus mendefinisikan variabel penundaan secara individual untuk setiap input. Kalau tidak, jika sb memasukkan teks ke input pertama dan dengan cepat melompat ke input lain dan mulai mengetik, panggilan balik untuk yang pertama TIDAK AKAN dipanggil!
Lihat kode di bawah saya datang dengan berdasarkan jawaban lain:
Solusi ini menjaga referensi setTimeout dalam variabel delayTimer input. Itu juga melewati referensi elemen ke callback seperti yang disarankan fazzyx.
Diuji dalam IE6, 8 (comp - 7), 8 dan Opera 12.11.
sumber
Ini berfungsi untuk saya di mana saya menunda operasi pencarian logika dan memeriksa apakah nilainya sama dengan yang dimasukkan dalam bidang teks. Jika nilainya sama maka saya melanjutkan dan melakukan operasi untuk data yang terkait dengan nilai pencarian.
sumber
Fungsi penundaan untuk memanggil pada setiap keyup. jQuery 1.7.1 atau lebih tinggi diperlukan
Pemakaian:
$('#searchBox').keyupDelay( cb );
sumber
Ini adalah solusi di sepanjang jalur CMS, tetapi memecahkan beberapa masalah utama bagi saya:
Pemakaian:
Kode ditulis dalam gaya yang saya nikmati, Anda mungkin perlu menambahkan banyak titik koma.
Hal-hal yang perlu diingat:
this
berfungsi seperti yang diharapkan (seperti pada contoh).setTimeout
.Solusi yang saya gunakan menambah tingkat kerumitan lain, memungkinkan Anda untuk membatalkan eksekusi, misalnya, tetapi ini merupakan dasar yang baik untuk dikembangkan.
sumber
Menggabungkan jawaban CMS dengan jawaban Miguel menghasilkan solusi yang kuat yang memungkinkan penundaan bersamaan.
Ketika Anda perlu menunda tindakan yang berbeda secara mandiri, gunakan argumen ketiga.
sumber
Membangun jawaban CMS inilah metode penundaan baru yang mempertahankan 'ini' dalam penggunaannya:
Pemakaian:
sumber
Menggunakan
di mana ekspresi adalah skrip untuk menjalankan dan batas waktu adalah waktu untuk menunggu dalam milidetik sebelum dijalankan - ini TIDAK mengganggu skrip, tetapi hanya menunda eksekusi bagian itu sampai batas waktu selesai.
akan mengatur ulang / menghapus batas waktu sehingga skrip tersebut tidak dijalankan dalam ekspresi (seperti batal) selama belum dieksekusi.
sumber
Berdasarkan jawaban CMS, itu hanya mengabaikan acara utama yang tidak mengubah nilai.
sumber
Gunakan plugin bindWithDelay jQuery:
sumber
sumber
Berikut adalah saran yang saya tulis yang menangani beberapa input dalam formulir Anda.
Fungsi ini mendapatkan Objek bidang input, masukkan ke dalam kode Anda
Ini adalah fungsi delayCall yang sebenarnya, menangani beberapa bidang input
Pemakaian:
sumber
Dari ES6 , seseorang dapat menggunakan sintaks fungsi panah juga.
Dalam contoh ini, kode menunda
keyup
acara selama 400 ms setelah pengguna selesai mengetik sebelum meneleponsearchFunc
membuat permintaan kueri.sumber
jQuery :
Javascript murni:
sumber
Lihatlah plugin autocomplete . Saya tahu bahwa ini memungkinkan Anda untuk menentukan penundaan atau jumlah karakter minimum. Bahkan jika Anda tidak menggunakan plugin, melihat-lihat kode akan memberi Anda beberapa ide tentang bagaimana menerapkannya sendiri.
sumber
Yah, saya juga membuat sepotong kode untuk membatasi permintaan ajax frekuensi tinggi yang disebabkan oleh Keyup / Keydown. Lihat ini:
https://github.com/raincious/jQueue
Lakukan kueri Anda seperti ini:
Dan ikat acara seperti ini:
sumber
Melihat ini hari ini sedikit terlambat tetapi hanya ingin meletakkan ini di sini kalau-kalau ada orang lain yang membutuhkan. pisahkan saja fungsi untuk membuatnya dapat digunakan kembali. kode di bawah ini akan menunggu 1/2 detik setelah mengetik berhenti.
sumber
Pengguna memasukkan pustaka javascript dan menggunakan fungsi _.debounce
sumber
sumber