Apakah ada cara untuk menghapus semua waktu tunggu dari jendela tertentu? Saya kira batas waktu disimpan di suatu tempat di window
objek tetapi tidak dapat memastikannya.
Solusi lintas browser apa pun diterima.
javascript
timeout
marcio
sumber
sumber
Jawaban:
Mereka tidak ada di objek jendela, tetapi mereka memiliki id, yang (afaik) adalah bilangan bulat berurutan.
Jadi, Anda dapat menghapus semua waktu tunggu seperti ini:
sumber
Saya pikir cara termudah untuk mencapai ini adalah dengan menyimpan semua
setTimeout
pengenal dalam satu larik, di mana Anda dapat dengan mudah beralih keclearTimeout()
semuanya.sumber
Saya memiliki tambahan jawaban Pumbaa80 yang mungkin berguna bagi seseorang yang mengembangkan IE lama.
Ya, semua browser utama menerapkan id waktu tunggu sebagai bilangan bulat berurutan (yang tidak diwajibkan oleh spesifikasi ). Melalui nomor awal berbeda dari browser ke browser. Tampaknya Opera, Safari, Chrome dan IE> 8 memulai id batas waktu dari 1, peramban berbasis Gecko dari 2 dan IE <= 8 dari beberapa nomor acak yang secara ajaib disimpan di seluruh penyegaran tab. Anda bisa menemukannya sendiri .
Semua itu berarti bahwa di IE <= 8
while (lastTimeoutId--)
siklus dapat berjalan lebih dari 8 digit kali dan menampilkan pesan " Skrip di halaman ini menyebabkan Internet Explorer berjalan lambat ". Jadi jika Anda tidak dapat menyimpan semua id batas waktu Anda atau tidak ingin menimpa window.setTimeout Anda dapat mempertimbangkan untuk menyimpan id batas waktu pertama pada halaman dan menghapus batas waktu sampai itu.Jalankan kode pada pemuatan halaman awal:
Dan kemudian hapus semua waktu tunggu yang tertunda yang mungkin telah diatur oleh kode asing berkali-kali yang Anda inginkan
sumber
Bagaimana dengan menyimpan id batas waktu dalam larik global, dan menentukan metode untuk mendelegasikan panggilan fungsi ke jendela.
sumber
Anda harus menulis ulang
window.setTimeout
metode dan menyimpan ID batas waktunya.sumber
Untuk menghapus semua waktu tunggu, mereka harus "ditangkap" terlebih dahulu :
Letakkan kode di bawah ini sebelum skrip lain dan itu akan membuat fungsi pembungkus untuk
setTimeout
&clearTimeout
.clearTimeouts
Metode baru akan ditambahkan kewindow
Objek, yang memungkinkan penghapusan semua batas waktu (menunggu) ( tautan inti ).sumber
Untuk kelengkapan, saya ingin memposting solusi umum yang mencakup
setTimeout
dansetInterval
.Tampaknya browser mungkin menggunakan kumpulan ID yang sama untuk keduanya, tetapi dari beberapa jawaban untuk Apakah clearTimeout dan clearInterval sama? , tidak jelas apakah aman mengandalkan
clearTimeout
danclearInterval
menjalankan fungsi yang sama atau hanya bekerja pada jenis pengatur waktu masing-masing.Oleh karena itu, jika tujuannya adalah untuk menghentikan semua waktu tunggu dan interval, berikut adalah penerapan yang mungkin sedikit lebih defensif di seluruh penerapan saat tidak dapat menguji semuanya:
Anda dapat menggunakannya untuk menghapus semua timer di jendela saat ini:
Atau Anda dapat menggunakannya untuk menghapus semua pengatur waktu di
iframe
:sumber
Saya menggunakan Vue dengan Typecript.
sumber
Gunakan waktu tunggu global tempat semua fungsi Anda lainnya mendapatkan pengaturan waktu. Ini akan membuat semuanya berjalan lebih cepat, dan lebih mudah dikelola, meskipun itu akan menambahkan beberapa abstraksi ke kode Anda.
sumber
set_timeout
fungsi global? Bisakah Anda memberikan contoh kode?Kami baru saja menerbitkan paket yang memecahkan masalah ini.
npm install time-events-manager
Dengan itu, Anda dapat melihat semua waktu tunggu dan interval melalui
timeoutCollection
&intervalCollection
objek. Ada jugaremoveAll
fungsi yang menghapus semua waktu tunggu / interval baik dari koleksi dan browser.sumber
Ini sudah sangat terlambat ... tapi:
Pada dasarnya, setTimeout / setInterval ID berjalan berurutan, jadi buat saja fungsi waktu tunggu dummy untuk mendapatkan ID tertinggi, lalu hapus interval pada semua ID yang lebih rendah dari itu.
sumber