Untuk semua browser utama (kecuali IE), onload
acara JavaScript tidak menyala ketika halaman dimuat sebagai hasil dari operasi tombol kembali - itu hanya menyala ketika halaman pertama kali dimuat.
Dapatkah seseorang mengarahkan saya ke beberapa contoh kode lintas-browser (Firefox, Opera, Safari, IE, ...) yang memecahkan masalah ini? Saya kenal dengan pageshow
acara Firefox tetapi sayangnya Opera atau Safari tidak mengimplementasikan ini.
javascript
pageload
Tagihan
sumber
sumber
Jawaban:
Guys, saya menemukan bahwa JQuery hanya memiliki satu efek: halaman dimuat ulang ketika tombol kembali ditekan. Ini tidak ada hubungannya dengan " siap ".
Bagaimana cara kerjanya? Yah, JQuery menambahkan pendengar acara onunload .
Secara default, itu tidak melakukan apa-apa. Tapi entah bagaimana ini tampaknya memicu pemuatan ulang di Safari, Opera dan Mozilla - tidak peduli apa yang ada di event handler.
[ sunting (Nickolay) : inilah mengapa ia bekerja seperti itu: webkit.org , developer.mozilla.org . Silakan baca artikel-artikel itu (atau ringkasan saya dalam jawaban terpisah di bawah) dan pertimbangkan apakah Anda benar - benar perlu melakukan ini dan membuat halaman Anda memuat lebih lambat untuk pengguna Anda.]
Tidak bisa percaya? Coba ini:
Anda akan melihat hasil yang serupa saat menggunakan JQuery.
Anda mungkin ingin membandingkan yang satu ini tanpa onunload
sumber
onunload
handler (halaman telah menghancurkan segalanya; mengapa menyimpannya?).Beberapa browser modern (Firefox, Safari, dan Opera, tetapi bukan Chrome) mendukung cache "back / forward" khusus (saya akan menyebutnya bfcache, yang merupakan istilah yang diciptakan oleh Mozilla), yang terlibat ketika pengguna menavigasi Kembali. Tidak seperti cache (HTTP) biasa, cache menangkap kondisi lengkap halaman (termasuk status JS, DOM). Ini memungkinkannya memuat ulang halaman lebih cepat dan persis seperti yang ditinggalkan pengguna.
The
load
event tidak seharusnya api ketika halaman dibuka dari bfcache ini. Misalnya, jika Anda membuat UI di penangan "load", dan acara "load" dipecat satu kali pada beban awal, dan kedua kalinya ketika halaman dimuat kembali dari bfcache, halaman tersebut akan berakhir dengan duplikat elemen UI.Ini juga mengapa menambahkan handler "unload" menghentikan halaman agar tidak disimpan dalam bfcache (sehingga membuatnya lebih lambat untuk menavigasi kembali ke) - handler unload dapat melakukan tugas pembersihan, yang dapat membuat halaman dalam keadaan tidak bisa dikerjakan.
Untuk halaman yang perlu tahu kapan mereka sedang bernavigasi / kembali ke, Firefox 1.5+ dan versi Safari dengan perbaikan untuk bug 28758 mendukung acara khusus yang disebut "pageshow" dan "pagehide".
Referensi:
sumber
Saya mengalami masalah yang tidak dieksekusi oleh js saya ketika pengguna mengklik kembali atau maju. Saya pertama kali memutuskan untuk menghentikan peramban dari caching, tetapi ini tampaknya tidak menjadi masalah. Javascript saya diatur untuk dijalankan setelah semua perpustakaan dll dimuat. Saya memeriksa ini dengan acara readyStateChange.
Setelah beberapa pengujian saya menemukan bahwa readyState elemen di halaman di mana kembali telah diklik tidak 'dimuat' tetapi 'lengkap'. Menambahkan
|| element.readyState == 'complete'
ke pernyataan kondisional saya memecahkan masalah saya.Hanya berpikir saya akan membagikan temuan saya, semoga mereka akan membantu orang lain.
Edit untuk kelengkapan
Kode saya terlihat sebagai berikut:
Dalam contoh kode di atas, variabel skrip adalah elemen skrip yang baru dibuat yang telah ditambahkan ke DOM.
sumber
OK, berikut ini adalah solusi final berdasarkan solusi awal ckramer dan contoh palehorse yang bekerja di semua browser, termasuk Opera. Jika Anda mengatur history.navigationMode ke 'kompatibel' maka fungsi siap jQuery akan diaktifkan pada operasi tombol Kembali di Opera serta browser utama lainnya.
Halaman ini memiliki informasi lebih lanjut .
Contoh:
Saya mengujinya di Opera 9.5, IE7, FF3 dan Safari dan berfungsi di semuanya.
sumber
Saya tidak bisa membuat contoh di atas berfungsi. Saya hanya ingin memicu penyegaran area div tertentu yang dimodifikasi ketika kembali ke halaman melalui tombol kembali. Trik yang saya gunakan adalah mengatur bidang input tersembunyi (disebut "bit kotor") menjadi 1 segera setelah area div berubah dari aslinya. Bidang input tersembunyi sebenarnya mempertahankan nilainya ketika saya mengklik kembali, jadi onload saya dapat memeriksa bit ini. Jika sudah diatur, saya me-refresh halaman (atau hanya menyegarkan divs). Namun, pada pemuatan asli, bitnya tidak diatur, jadi saya tidak membuang waktu memuat halaman dua kali.
Dan itu akan terpicu dengan benar setiap kali saya mengklik tombol kembali.
sumber
Jika saya ingat dengan benar, maka menambahkan peristiwa unload () berarti bahwa halaman tidak dapat di-cache (dalam cache maju / mundur) - karena itu keadaan berubah / dapat berubah ketika pengguna menavigasi pergi. Jadi - tidak aman untuk mengembalikan keadaan detik terakhir dari halaman ketika kembali ke sana dengan menavigasi melalui objek sejarah.
sumber
Saya pikir ini untuk "onunload", bukan memuat halaman, karena bukankah kita berbicara tentang memecat suatu peristiwa ketika menekan "Kembali"? $ document.ready () adalah untuk acara yang diinginkan pada pemuatan halaman, tidak peduli bagaimana Anda sampai ke halaman itu (yaitu mengarahkan, membuka browser ke URL secara langsung, dll.), bukan ketika mengklik "Kembali", kecuali jika Anda berbicara tentang apa yang harus diaktifkan pada halaman sebelumnya ketika memuat lagi. Dan saya tidak yakin halaman tidak di-cache karena saya menemukan bahwa Javascripts masih, bahkan ketika $ document.ready () termasuk di dalamnya. Kami harus menekan Ctrl + F5 ketika mengedit skrip kami yang memiliki acara ini setiap kali kami merevisinya dan kami ingin menguji hasilnya di halaman kami.
adalah apa yang Anda inginkan untuk acara onunload ketika menekan "Kembali" dan membongkar halaman saat ini, dan juga akan diaktifkan ketika pengguna menutup jendela browser. Ini terdengar lebih seperti apa yang diinginkan, bahkan jika saya kalah jumlah dengan $ document.ready (). Pada dasarnya perbedaannya adalah antara peristiwa yang terjadi pada halaman saat ini ketika sedang ditutup atau pada acara yang memuat ketika mengklik "Kembali" saat memuat. Diuji dalam IE 7 baik-baik saja, tidak dapat berbicara untuk browser lain karena mereka tidak diizinkan di mana kita berada. Tapi ini mungkin pilihan lain.
sumber
Saya dapat mengkonfirmasi ckramer bahwa acara siap jQuery berfungsi di IE dan FireFox. Berikut ini contohnya:
sumber
untuk orang-orang yang tidak ingin menggunakan seluruh pustaka jquery saya mengekstrak implementasinya dalam kode terpisah. Besarnya hanya 0,4 KB.
Anda dapat menemukan kode, bersama-sama dengan tutorial bahasa Jerman di wiki ini: http://www.easy-coding.de/wiki/html-ajax-und-co/onload-event-cross-browser-kompatibler-domcontentloaded.html
sumber
Acara siap jQuery dibuat hanya untuk masalah seperti ini. Anda mungkin ingin menggali implementasi untuk melihat apa yang terjadi di bawah selimut.
sumber
ready
sepertinya tidak terpicu di Firefox, saat menggunakan tombol Back. Lihat juga jawaban Nickolay .Bill, saya berani menjawab pertanyaan Anda, namun saya tidak 100% yakin dengan dugaan saya. Saya pikir selain browser IE saat membawa pengguna ke halaman dalam sejarah tidak hanya akan memuat halaman dan sumber dayanya dari cache tetapi mereka juga akan mengembalikan seluruh DOM (sesi baca) untuk itu. IE tidak melakukan restorasi DOM (atau tidak melakukan sewa) dan dengan demikian acara onload tampaknya diperlukan untuk inisialisasi ulang halaman yang benar di sana.
sumber
Saya mencoba solusi dari Bill menggunakan $ (dokumen). Sudah ... tetapi pada awalnya itu tidak berhasil. Saya menemukan bahwa jika skrip ditempatkan setelah bagian html, itu tidak akan berfungsi. Jika itu adalah bagian kepala itu akan berfungsi tetapi hanya di IE. Skrip tidak berfungsi di Firefox.
sumber
OK, saya mencoba ini dan berfungsi di Firefox 3, Safari 3.1.1, dan IE7 tetapi tidak di Opera 9.52.
Jika Anda menggunakan contoh yang ditunjukkan di bawah ini (berdasarkan contoh palehorse), Anda mendapatkan kotak peringatan yang muncul saat halaman pertama kali dimuat. Tetapi jika Anda kemudian pergi ke URL lain, dan kemudian tekan tombol Kembali untuk kembali ke halaman ini, Anda tidak mendapatkan kotak peringatan yang muncul di Opera (tetapi Anda melakukannya di browser lain).
Bagaimanapun, saya pikir ini cukup dekat untuk saat ini. Terimakasih semuanya!
sumber
Bongkar acara tidak berfungsi dengan baik pada IE 9. Saya mencobanya dengan memuat acara (onload ()), ia bekerja dengan baik pada IE 9 dan FF5 .
Contoh:
sumber
Saya telah menggunakan templat html. Dalam file custom.js template ini, ada fungsi seperti ini:
Tetapi fungsi ini tidak berfungsi ketika saya kembali setelah pergi ke halaman lain.
Jadi, saya mencoba ini dan berhasil:
Sekarang, saya memiliki 2 fungsi "siap" tetapi tidak memberikan kesalahan dan halaman berfungsi dengan baik.
Namun demikian, saya harus menyatakan bahwa itu telah diuji pada Windows 10 - Opera v53 dan Edge v42 tetapi tidak ada browser lain. Ingatlah ini ...
Catatan: versi jquery adalah 3.3.1 dan versi migrasi adalah 3.0.0
sumber