Alasan Anda perlu menelepon nextatau dequeuememberi tahu jQuery bahwa Anda telah selesai dengan item yang antri ini dan harus pindah ke item berikutnya.
Saya suka opsi ini karena membuatnya mudah untuk memberikan referensi ke objek jquery yang digunakan dalam fungsi antrian, sehingga dapat digunakan dalam konteks yang lebih umum (tanpa nama kode yang keras).
GrandmasterB
5
Mengapa kita perlu "selanjutnya"? Bisakah kita melakukan $ ("# div"). AddClass ("error"). Delay (1000) .queue (function () {$ (this) .removeClass ("error");}); Tampak lebih elegan?
Vennsoh
@Vennsoh Anda tidak perlu melewati item antrian 'berikutnya'. Anda dapat memilih untuk menggunakan metode dequeue (): api.jquery.com/dequeue
gfullam
49
AFAIK metode penundaan hanya berfungsi untuk modifikasi CSS numerik.
Untuk keperluan lain, JavaScript hadir dengan metode setTimeout:
+1: Jangan gunakan Jquery demi Jquery. Ada solusi javascript sederhana untuk banyak masalah.
Joel
1
+1: Sama seperti komentar pertama. JS sederhana juga berfungsi dengan baik beberapa kali.
wowpatrick
1
Memberi +1 untuk kesederhanaan, tetapi juga memberi +1 pada jawaban yang diterima - seperti yang saya tunjukkan bahwa .queue () benar-benar melewati objek lanjutan yang harus dipanggil secara manual ('berikutnya ()'). Saya telah menghabiskan setengah jam bertanya-tanya mengapa rantai panggilan balik tanpa parameter saya hanya mengeksekusi yang pertama - banyak contoh di situs lain menggunakan penundaan tunggal dalam rantai dan panggilan balik tanpa parameter, yang sedikit menyesatkan terlalu banyak penyederhanaan mekanisme itu
quetzalcoatl
1
Hanya catatan pedant: setTimeout berasal dari objek jendela browser (BOM). JavaScript (dipahami sebagai ECMA Script) tidak memiliki metode itu.
corbacho
9
Saya tahu ini posting yang sangat lama tetapi saya telah menggabungkan beberapa jawaban ke dalam fungsi pembungkus jQuery yang mendukung perangkaian. Semoga bermanfaat bagi seseorang:
Anda tidak harus menggunakan delay () dengan setTimeout ().
MattYao
@MattYao Saya tidak berpikir Anda mendapatkan idenya. Jika Anda tidak menggunakan setTimeout, maka penundaan itu tidak akan berhasil
Alex Jolig
1
Solusinya tidak perlu keduanya untuk bekerja sama. Baik menggunakan delay () dengan antrian () di jQuery atau cukup menggunakan setTimeout () dapat menyelesaikan masalah. Saya tidak mengatakan jawaban Anda salah.
MattYao
0
Coba ini:
function removeClassDelayed(jqObj, c, to){
setTimeout(function(){ jqObj.removeClass(c);}, to);}
removeClassDelayed($("#div"),"error",1000);
$("#div").addClassTemporarily("error",1000)
Jawaban:
Anda dapat membuat item antrian baru untuk menghapus kelas:
Atau menggunakan metode dequeue :
Alasan Anda perlu menelepon
next
ataudequeue
memberi tahu jQuery bahwa Anda telah selesai dengan item yang antri ini dan harus pindah ke item berikutnya.sumber
AFAIK metode penundaan hanya berfungsi untuk modifikasi CSS numerik.
Untuk keperluan lain, JavaScript hadir dengan metode setTimeout:
sumber
Saya tahu ini posting yang sangat lama tetapi saya telah menggabungkan beberapa jawaban ke dalam fungsi pembungkus jQuery yang mendukung perangkaian. Semoga bermanfaat bagi seseorang:
Dan inilah pembungkus removeClass:
Sekarang Anda dapat melakukan hal-hal seperti ini - tunggu 1dtk, tambahkan
.error
, tunggu 3dtk, hapus.error
:$('#div').delay(1000).queueAddClass('error').delay(2000).queueRemoveClass('error');
sumber
Manipulasi CSS jQuery tidak di-antri, tetapi Anda dapat membuatnya dieksekusi di dalam antrian 'fx' dengan melakukan:
Hal yang sama seperti memanggil setTimeout tetapi menggunakan mekanisme antrian jQuery sebagai gantinya.
sumber
Tentu saja akan lebih sederhana jika Anda memperpanjang jQuery seperti ini:
setelah itu Anda bisa menggunakan fungsi ini seperti addClass:
sumber
return this
ke fungsi ...Keterlambatan beroperasi dalam antrian. dan sejauh yang saya tahu manipulasi css (selain melalui bernyawa) tidak mengantri.
sumber
delay
tidak berfungsi pada fungsi tidak ada antrian, jadi kita harus menggunakansetTimeout()
.Dan Anda tidak perlu memisahkan hal-hal. Yang perlu Anda lakukan adalah memasukkan semuanya dalam suatu
setTimeOut
metode:sumber
Coba ini:
sumber
Coba funtion panah sederhana ini:
setTimeout( () => { $("#div").addClass("error") }, 900 );
sumber