Bagaimana Anda secara definitif mendeteksi apakah pengguna telah menekan tombol kembali di browser atau tidak?
Bagaimana Anda menegakkan penggunaan tombol kembali di dalam halaman di dalam aplikasi web satu halaman menggunakan #URL
sistem?
Kenapa tidak tombol kembali browser menyalakan acara mereka sendiri !?
Jawaban:
(Catatan: Sesuai umpan balik Sharky, saya telah menyertakan kode untuk mendeteksi backspaces)
Jadi, saya sering melihat pertanyaan-pertanyaan ini di SO, dan baru-baru ini mengalami masalah dalam mengontrol fungsi tombol kembali sendiri. Setelah beberapa hari mencari solusi terbaik untuk aplikasi saya (Satu Halaman dengan Navigasi Hash), saya telah membuat sistem yang sederhana, lintas peramban, tanpa perpustakaan untuk mendeteksi tombol kembali.
Kebanyakan orang merekomendasikan untuk menggunakan:
Namun, fungsi ini juga akan dipanggil ketika pengguna menggunakan elemen dalam halaman yang mengubah hash lokasi. Bukan pengalaman pengguna terbaik ketika pengguna Anda mengklik dan halaman berjalan mundur atau maju.
Untuk memberi Anda garis besar umum sistem saya, saya mengisi array dengan hash sebelumnya saat pengguna saya bergerak melalui antarmuka. Itu terlihat seperti ini:
Cukup lurus ke depan. Saya melakukan ini untuk memastikan dukungan lintas-browser, serta dukungan untuk browser yang lebih lama. Cukup sampaikan hash baru ke fungsi, dan itu akan menyimpannya untuk Anda dan kemudian mengubah hash (yang kemudian dimasukkan ke dalam sejarah browser).
Saya juga memanfaatkan tombol kembali di dalam halaman yang menggerakkan pengguna di antara halaman menggunakan
lasthash
array. Ini terlihat seperti ini:Jadi ini akan memindahkan pengguna kembali ke hash terakhir, dan menghapus hash terakhir dari array (saya tidak punya tombol maju sekarang).
Begitu. Bagaimana cara mendeteksi apakah pengguna telah menggunakan tombol kembali di-halaman saya, atau tombol browser?
Pada awalnya saya melihat
window.onbeforeunload
, tetapi tidak berhasil - itu hanya disebut jika pengguna akan mengubah halaman. Ini tidak terjadi dalam aplikasi satu halaman menggunakan navigasi hash.Jadi, setelah beberapa penggalian lagi, saya melihat rekomendasi untuk mencoba mengatur variabel flag. Masalah dengan ini dalam kasus saya, adalah bahwa saya akan mencoba untuk mengaturnya, tetapi karena semuanya asinkron, itu tidak akan selalu diatur dalam waktu untuk pernyataan if dalam perubahan hash.
.onMouseDown
tidak selalu dipanggil klik, dan menambahkannya ke onclick tidak akan pernah memicunya cukup cepat.Ini adalah ketika saya mulai melihat perbedaan antara
document
, danwindow
. Solusi terakhir saya adalah mengatur flag menggunakandocument.onmouseover
, dan menonaktifkannya menggunakandocument.onmouseleave
.Yang terjadi adalah ketika mouse pengguna berada di dalam area dokumen (baca: halaman yang diberikan, tetapi tidak termasuk bingkai browser), boolean saya disetel ke
true
. Segera setelah mouse meninggalkan area dokumen, boolean membalik kefalse
.Dengan cara ini, saya dapat mengubah
window.onhashchange
ke:Anda akan mencatat cek untuk
#undefined
. Ini karena jika tidak ada riwayat yang tersedia di array saya, itu kembaliundefined
. Saya menggunakan ini untuk bertanya kepada pengguna apakah mereka ingin pergi menggunakanwindow.onbeforeunload
acara.Jadi, singkatnya, dan untuk orang-orang yang tidak perlu menggunakan tombol kembali di-halaman atau array untuk menyimpan sejarah:
Dan begitulah. sederhana, tiga bagian cara untuk mendeteksi penggunaan tombol kembali vs elemen dalam halaman sehubungan dengan navigasi hash.
EDIT:
Untuk memastikan bahwa pengguna tidak menggunakan backspace untuk memicu acara kembali, Anda juga dapat memasukkan yang berikut (Terima kasih kepada @thetoolman pada Pertanyaan ini ):
sumber
Anda dapat mencoba
popstate
event handler, misalnya:Catatan: Untuk hasil terbaik, Anda harus memuat kode ini hanya pada halaman tertentu di mana Anda ingin menerapkan logika untuk menghindari masalah yang tidak terduga lainnya.
Acara popstate dipecat setiap kali ketika entri riwayat saat ini berubah (pengguna menavigasi ke negara baru). Itu terjadi ketika pengguna mengklik Kembali / Forward tombol browser atau ketika
history.back()
,history.forward()
,history.go()
metode programatik disebut.The
event.state
adalah milik dari acara ini adalah sama dengan objek negara sejarah.Untuk sintaks jQuery, lilitkan (untuk menambahkan pendengar genap setelah dokumen siap):
Lihat juga: window.onpopstate saat memuat halaman
Lihat juga contoh di Aplikasi Halaman Tunggal dan halaman pushState HTML5 :
Ini harus kompatibel dengan Chrome 5+, Firefox 4+, IE 10+, Safari 6+, Opera 11.5+ dan yang serupa.
sumber
Saya telah berjuang dengan persyaratan ini cukup lama dan mengambil beberapa solusi di atas untuk mengimplementasikannya. Namun, saya menemukan sebuah pengamatan dan tampaknya bekerja di browser Chrome, Firefox dan Safari + Android dan iPhone
Pemuatan halaman:
Beri tahu saya jika ini membantu. Jika saya melewatkan sesuatu, saya akan senang untuk mengerti.
sumber
event
memiliki nilai bahkan untuk tombol majuDalam javascript, tipe navigasi
2
berarti tombol kembali atau maju browser diklik dan browser sebenarnya mengambil konten dari cache.sumber
Ini pasti akan berfungsi (Untuk mendeteksi klik tombol kembali)
sumber
Lihat ini:
itu bekerja dengan baik ...
sumber
Ini adalah satu-satunya solusi yang berfungsi untuk saya (ini bukan situs web onsite). Ini bekerja dengan Chrome, Firefox, dan Safari.
sumber
Jawaban yang benar sudah ada untuk menjawab pertanyaan. Saya ingin menyebutkan baru JavaScript API PerformanceNavigationTiming , itu menggantikan performance.navigation yang sudah usang .
Kode berikut akan masuk konsol "back_forward" jika pengguna mendarat di halaman Anda menggunakan tombol kembali atau maju. Lihatlah tabel kompatibilitas sebelum menggunakannya dalam proyek Anda.
sumber
Browser: https://jsfiddle.net/Limitlessisa/axt1Lqoz/
Untuk kontrol seluler: https://jsfiddle.net/Limitlessisa/axt1Lqoz/show/
sumber
Inilah pendapat saya. Asumsinya adalah, ketika URL berubah tetapi tidak ada klik di dalam yang
document
terdeteksi, itu adalah browser kembali (ya, atau meneruskan). Klik pengguna direset setelah 2 detik untuk membuatnya berfungsi pada halaman yang memuat konten melalui Ajax:sumber
Saya dapat menggunakan beberapa jawaban di utas ini dan lainnya untuk membuatnya berfungsi di IE dan Chrome / Edge. history.pushState bagi saya tidak didukung di IE11.
sumber
Komponen lengkap dapat diimplementasikan hanya jika Anda mendefinisikan ulang API (mengubah metode objek 'sejarah') Saya akan membagikan kelas yang baru saja ditulis. Diuji hanya pada Chrome dan Mozilla. Mendukung HTML5 dan ECMAScript5-6
sumber
Document.mouseover tidak berfungsi untuk IE dan FireFox. Namun saya sudah mencoba ini:
Ini berfungsi untuk Chrome dan IE dan bukan FireFox. Masih bekerja untuk memperbaiki FireFox. Cara mudah untuk mendeteksi klik tombol Kembali / Maju dari browser dipersilahkan, tidak terutama di JQuery tetapi juga AngularJS atau Javascript biasa.
sumber
Kode di atas bekerja untuk saya. Pada browser seluler, ketika pengguna mengklik tombol kembali, kami ingin mengembalikan status halaman sesuai kunjungan sebelumnya.
sumber
Saya menyelesaikannya dengan melacak acara asli yang memicu
hashchange
(baik itu gesekan, klik atau roda), sehingga acara tersebut tidak akan keliru dengan pendaratan sederhana di halaman, dan menggunakan bendera tambahan di masing-masing binding acara saya. Peramban tidak akan mengatur bendera lagifalse
ketika menekan tombol kembali:sumber
Saya mencoba opsi di atas tetapi tidak ada yang bekerja untuk saya. Ini solusinya
Lihat tautan ini http://www.codeproject.com/Articles/696526/Solution-to-Browser-Back-Button-Click-Event-Handli untuk rincian lebih lanjut
sumber