Jika javascript memodifikasi DOM di halaman A, pengguna menavigasi ke halaman B dan kemudian menekan tombol kembali untuk kembali ke halaman A. Semua modifikasi pada DOM halaman A hilang dan pengguna disajikan dengan versi yang aslinya diambil dari server.
Ini berfungsi seperti itu di stackoverflow, reddit, dan banyak situs web populer lainnya. (coba tambahkan komentar percobaan ke pertanyaan ini, lalu navigasikan ke halaman lain dan tekan tombol kembali untuk kembali - komentar Anda akan "hilang")
Ini masuk akal, namun beberapa situs web (apple.com, basecamphq.com, dll) memaksa browser untuk menyajikan status halaman terbaru kepada pengguna. (buka http://www.apple.com/ca/search/?q=ipod , klik ucapkan tautan Unduhan di bagian atas lalu klik tombol kembali - semua pembaruan DOM akan dipertahankan)
darimana datangnya ketidakkonsistenan?
sumber
Jawaban:
Satu jawaban: Antara lain, peristiwa unload menyebabkan cache mundur / maju menjadi tidak valid .
Beberapa browser menyimpan status terkini dari keseluruhan halaman web dalam apa yang disebut "bfcache" atau "cache halaman". Ini memungkinkan mereka merender ulang halaman dengan sangat cepat saat menavigasi melalui tombol kembali dan maju, dan mempertahankan status DOM dan semua variabel JavaScript. Namun, jika halaman berisi peristiwa saat muat ulang, peristiwa tersebut berpotensi membuat halaman menjadi tidak berfungsi, sehingga halaman tidak disimpan di bfcache dan harus dimuat ulang (tetapi dapat dimuat dari cache standar) dan dirender dari awal, termasuk menjalankan semua penangan onload. Saat kembali ke halaman melalui bfcache, DOM disimpan dalam keadaan sebelumnya, tanpa perlu mengaktifkan penangan onload (karena halaman sudah dimuat).
Perhatikan bahwa perilaku bfcache berbeda dari cache browser standar dalam kaitannya dengan Cache-Control dan header HTTP lainnya. Dalam banyak kasus, browser akan menyimpan halaman di bfcache meskipun jika halaman tidak disimpan dalam cache standar.
jQuery secara otomatis melampirkan acara unload ke jendela, jadi sayangnya menggunakan jQuery akan mendiskualifikasi halaman Anda dari disimpan di bfcache untuk pelestarian DOM dan cepat mundur / maju. [Pembaruan: ini telah diperbaiki di jQuery 1.4 sehingga hanya berlaku untuk IE]sumber
Saya telah mencoba membuat Chrome berperilaku seperti Safari, dan satu-satunya cara yang berhasil adalah dengan mengatur
Cache-control: no-store
header. Ini memaksa browser untuk mengambil kembali halaman dari server saat pengguna menekan tombol kembali. Tidak ideal, tetapi lebih baik daripada diperlihatkan halaman yang sudah kadaluwarsa.sumber
Facebook mengingat status halaman dengan memodifikasi pengenal hash di URL untuk permintaan ajax. Perubahan ini dicatat dalam riwayat browser, jadi ketika pengguna mengklik tombol kembali, hash berubah seperti sebelumnya. Jadi tersirat bahwa Anda akan membutuhkan beberapa Javascript untuk memantau pengenal has dan bereaksi ketika diubah oleh browser. Andreas Blixt memiliki skrip pemantauan hash yang tersedia .
sumber
Ini tidak ada hubungannya dengan simbol hash (#).
Jika Anda ingin memeriksa header HTTP apple, itu hanya menyimpan halaman.
sumber
Menggunakan pengenal hash / fragmen URL adalah cara yang cukup umum untuk menghubungkan / mengingat status dalam aplikasi web yang bergantung pada pembaruan Ajax dan DOM.
Lihat proyek Sejarah Sangat Sederhana untuk beberapa ide. Dimungkinkan untuk memonitor URL untuk perubahan pada hash, dan rsh melakukan ini, dengan mempertimbangkan perbedaan browser.
sumber
Untuk siapa pun yang mengalami masalah dengan
Rails
dan ini - masalah Anda bukanlah bfcache (saya kira dulu) - initurbolinks
permata. Berikut cara menghapusnya.Mudah-mudahan ini akan menghemat waktu Anda dan membenturkan kepala Anda ke dinding.
sumber
Apa yang Anda cari adalah untuk beberapa jenis manajemen hash URL. # Di url hanya untuk sisi klien.
Saat Anda mengubah status kembali dengan JS, maka Anda memperbarui data di # url.
Anda juga menambahkan beberapa jenis polling yang memantau jika hash telah berubah, dan memuat status halaman berdasarkan data baru di hash.
Lihatlah ini:
http://ajaxpatterns.org/Unique_URLs
sumber