Bagaimana untuk mengesan peristiwa butang belakang pelayar - pelayar silang
P粉141911244
2023-08-23 16:23:49
<p>Bagaimana untuk mengesan secara eksplisit jika pengguna menekan butang belakang dalam penyemak imbas? </p>
<p>Bagaimana cara saya menggunakan sistem <code>#URL</code> untuk memaksa penggunaan butang belakang dalam halaman dalam aplikasi web satu halaman? </p>
<p>Mengapa butang kembali penyemak imbas tidak mencetuskan acaranya sendiri? ? </p>
Anda boleh mencuba
popstate
pengendali acara seperti:Nota: Untuk hasil terbaik, anda hanya perlu memuatkan kod ini pada halaman tertentu yang anda mahu melaksanakan logik untuk mengelakkan sebarang isu lain yang tidak dijangka.
Acara popstate dinyalakan setiap kali entri sejarah semasa berubah (pengguna menavigasi ke keadaan baharu). Ini berlaku apabila pengguna mengklik butang belakang/maju penyemak imbas atau apabila kaedah
history.back()
、history.forward()
、history.go()
> dipanggil secara pengaturcaraan.event.state
ialah atribut peristiwa, sama dengan objek keadaan sejarah.Untuk sintaks jQuery, bungkusnya (tambah pendengar yang sekata selepas dokumen siap):
Lihat juga: window.onpopstate pada pemuatan halaman
Lihat juga halaman contoh pada Aplikasi Halaman Tunggal dan HTML5 PushState:
Ini sepatutnya serasi dengan Chrome 5+, Firefox 4+, IE 10+, Safari 6+, Opera 11.5+ dan versi yang serupa.
(Nota: Saya menambah kod untuk mengesan ruang belakang berdasarkan maklum balas daripada Sharky)
Jadi, saya sering melihat soalan ini tentang SO, dan baru-baru ini saya menghadapi masalah mengawal fungsi butang belakang sendiri. Selepas berhari-hari mencari penyelesaian terbaik untuk aplikasi saya (halaman tunggal dengan navigasi dicincang), saya menghasilkan sistem tanpa pustaka yang ringkas, silang pelayar, bebas perpustakaan untuk mengesan butang belakang.
Kebanyakan orang mengesyorkan menggunakan:
Walau bagaimanapun, fungsi ini juga dipanggil apabila pengguna menggunakan elemen dalam halaman yang mengubah cincang kedudukan. Ini bukan pengalaman pengguna terbaik apabila pengguna mengklik dan halaman bergerak ke belakang atau ke hadapan.
Untuk memberi anda garis besar umum sistem saya, semasa pengguna bergerak melalui antara muka, saya akan mengisi tatasusunan dengan nilai cincang sebelumnya. Ia kelihatan seperti ini:
Sangat mudah. Saya melakukan ini untuk memastikan sokongan silang pelayar serta sokongan untuk pelayar lama. Hanya hantar nilai cincang baharu kepada fungsi dan ia akan menyimpannya untuk anda, kemudian tukar nilai cincang (dan kemudian masukkannya dalam sejarah penyemak imbas).
Saya juga mengambil kesempatan daripada butang belakang dalam halaman yang menggunakan tatasusunan
lasthash
untuk mengalihkan pengguna antara halaman. Ia kelihatan seperti ini:Jadi ini mengalihkan pengguna kembali ke cincang terakhir dan mengalih keluar cincangan terakhir daripada tatasusunan (saya tidak mempunyai butang ke hadapan sekarang).
Jadi. Bagaimanakah saya dapat mengesan jika pengguna menggunakan butang belakang dalam halaman atau butang penyemak imbas saya?
Pada mulanya saya melihat
window.onbeforeunload
tetapi tidak berjaya - ia hanya dipanggil apabila pengguna ingin menukar halaman. Ini tidak berlaku dalam aplikasi satu halaman menggunakan navigasi cincang.Jadi, selepas beberapa kali menggali, saya melihat cadangan untuk mencuba menetapkan pembolehubah bendera. Dalam kes saya, masalahnya ialah saya akan cuba menetapkannya, tetapi memandangkan semuanya tidak segerak, ia tidak akan sentiasa ditetapkan dalam masa untuk pernyataan if dalam perubahan cincang.
.onMouseDown
tidak selalu dipanggil dalam klik , dan menambahkannya pada onclick tidak akan mencetuskannya dengan cukup cepat.Sejak itu saya mula menyelidik
文档
和窗口
之间的区别。我的最终解决方案是使用document.onmouseover
设置该标志,并使用document.onmouseleave
melumpuhkannya.Apa yang berlaku ialah apabila tetikus pengguna berada dalam kawasan dokumen (baca: halaman yang diberikan, tetapi bukan bingkai penyemak imbas), boolean saya ditetapkan kepada
true
。一旦鼠标离开文档区域,布尔值就会翻转为false
.Dengan cara ini, saya boleh menukar
window.onhashchange
kepada:Anda akan melihat semakan untuk
#undefined
. Ini kerana jika tiada sejarah tersedia dalam tatasusunan saya ia mengembalikanundefined
. Saya menggunakan ini untuk bertanya kepada pengguna jika mereka mahu keluar menggunakan acara#undefined
的检查。这是因为如果我的数组中没有可用的历史记录,它将返回undefined
。我用它来询问用户是否想使用window.onbeforeunload
.Jadi, secara ringkasnya, bagi sesiapa yang tidak semestinya menggunakan butang belakang dalam halaman atau tatasusunan untuk menyimpan sejarah:
Ini yang anda mahukan. Pendekatan tiga bahagian mudah untuk mengesan penggunaan butang belakang berbanding elemen dalam halaman dari segi navigasi cincang.
Editor:
Untuk memastikan pengguna tidak menggunakan kekunci ruang belakang untuk mencetuskan acara belakang, anda juga boleh memasukkan perkara berikut (terima kasih kepada soalan ini):