Saya ingin menggunakan JavaScript untuk melihat apakah ada riwayat atau tidak, maksud saya jika tombol kembali tersedia di browser atau tidak.
javascript
Ryan
sumber
sumber
Jawaban:
Jawaban singkat: Anda tidak bisa.
Secara teknis ada cara yang akurat, yang akan memeriksa properti:
Namun, itu tidak akan berhasil. Masalah dengan ini adalah bahwa di sebagian besar browser ini dianggap sebagai pelanggaran keamanan dan biasanya hanya mengembalikan tidak terdefinisi .
Adalah properti yang disarankan orang lain ...
Namun , panjangnya tidak berfungsi sepenuhnya karena itu tidak menunjukkan di mana Anda berada dalam sejarah. Selain itu, tidak selalu dimulai pada nomor yang sama. Peramban yang tidak disetel untuk memiliki laman landas, misalnya, mulai dari 0 sedangkan peramban lain yang menggunakan laman landas akan mulai dari 1.
Sebagian besar waktu tautan ditambahkan yang memanggil:
atau
dan itu hanya diharapkan bahwa jika Anda tidak dapat kembali maka mengklik tautan itu tidak menghasilkan apa-apa.
sumber
Ada cara lain untuk memeriksa - periksa pengarah. Halaman pertama biasanya memiliki pengarah kosong ...
sumber
Kode saya membiarkan peramban mundur satu halaman, dan jika gagal, memuat url mundur. Itu juga mendeteksi perubahan hashtag.
Ketika tombol kembali tidak tersedia, url mundur akan dimuat setelah 500 ms, sehingga browser memiliki cukup waktu untuk memuat halaman sebelumnya. Memuat url fallback segera setelah itu
window.history.go(-1);
akan menyebabkan browser menggunakan url fallback, karena skrip js belum berhenti.sumber
chrome://newtab
dan dengan demikian Anda dapat kembali ke sejarah.Inilah cara saya melakukannya.
Saya menggunakan acara 'beforeunload' untuk mengatur boolean. Kemudian saya mengatur batas waktu untuk menonton apakah 'sebelumunload' dipecat.
Tampaknya berfungsi di browser utama (diuji FF, Chrome, IE11 sejauh ini).
sumber
window.location.href = fallback
denganwindow.close()
dan bekerja juga.Ada cuplikan yang saya gunakan dalam proyek saya:
FYI: Saya menggunakan History.js untuk mengelola riwayat browser.
Mengapa membandingkan history.length ke nomor 2?
Karena laman awal Chrome dihitung sebagai item pertama dalam riwayat peramban.
Ada beberapa kemungkinan
history.length
dan perilaku pengguna:history.length = 2
dan kami ingin menonaktifkanback()
dalam hal ini, karena pengguna akan pergi ke tab kosong.history.length = 1
dan sekali lagi kami ingin menonaktifkanback()
metode.history.length > 2
dan sekarangback()
bisa diaktifkan.Catatan: Saya menghilangkan kasus ketika pengguna mendarat di halaman saat ini setelah mengklik tautan dari situs web eksternal tanpa
target="_blank"
.Catatan 2:
document.referrer
kosong ketika Anda membuka situs web dengan mengetikkan alamatnya dan juga ketika situs web menggunakan ajax untuk memuat subhalaman, jadi saya berhenti memeriksa nilai ini dalam kasus pertama.sumber
ini tampaknya melakukan trik:
Panggil history.back () dan kemudian window.close (). Jika peramban dapat kembali ke riwayat, peramban tidak akan dapat melanjutkan ke pernyataan berikutnya. Jika tidak bisa kembali, itu akan menutup jendela.
Namun, harap dicatat bahwa jika halaman telah dicapai dengan mengetikkan url, maka firefox tidak akan mengizinkan skrip untuk menutup jendela.
sumber
window.close()
dianggap sebagai risiko keamanan oleh banyak browser modern. Beberapa hanya tidak akan membiarkan Anda melakukannya.Hati-hati dengan
window.history.length
karena ini juga termasuk entri untukwindow.history.forward()
Jadi, Anda mungkin memiliki
window.history.length
lebih dari 1 entri, tetapi tidak ada entri riwayat. Ini berarti tidak ada yang terjadi jika Anda menembakwindow.history.back()
sumber
Anda tidak dapat langsung memeriksa apakah tombol kembali dapat digunakan. Anda dapat melihat
history.length>0
, tetapi itu akan berlaku jika ada halaman di depan halaman saat ini juga. Anda hanya dapat memastikan bahwa tombol kembali tidak dapat digunakan kapanhistory.length===0
.Jika itu tidak cukup baik, yang bisa Anda lakukan hanyalah menelepon
history.back()
dan, jika halaman Anda masih dimuat setelahnya, tombol kembali tidak tersedia! Tentu saja itu berarti jika tombol kembali adalah tersedia, Anda baru saja navigasikan jauh dari halaman. Anda tidak boleh membatalkan navigasionunload
, jadi yang bisa Anda lakukan untuk menghentikannya adalah mengembalikan sesuatuonbeforeunload
, yang akan menghasilkan prompt besar yang mengganggu. Itu tidak layak.Sebenarnya itu adalah ide yang sangat buruk untuk melakukan apapun dengan sejarah. Navigasi riwayat adalah untuk browser chrome, bukan halaman web. Menambahkan tautan "kembali" biasanya menyebabkan lebih banyak kebingungan pengguna daripada nilainya.
sumber
1
! Itu0
adalah brainstart, saya pikir browser akan selalu merespons1
atau lebih. Ternyata Opera dan IE berpikir sebaliknya — tangkapan yang bagus.history.length
tidak berguna karena tidak menunjukkan apakah pengguna dapat kembali dalam sejarah. Browser yang berbeda juga menggunakan nilai awal 0 atau 1 - tergantung pada browser.Solusi yang berfungsi adalah menggunakan
$(window).on('beforeunload'
event, tapi saya tidak yakin itu akan berfungsi jika halaman dimuat melalui ajax dan menggunakan pushState untuk mengubah riwayat jendela.Jadi saya telah menggunakan solusi berikut:
sumber
Saya datang dengan pendekatan berikut. Itu menggunakan acara onbeforeunload untuk mendeteksi apakah browser mulai meninggalkan halaman atau tidak. Jika tidak dalam rentang waktu tertentu, itu hanya akan mengarahkan ke fallback.
Anda dapat memanggil fungsi ini menggunakan
goBack("fallback.example.org")
.sumber
windows.onbeforeunload
menjadi pendengar acarawindow.addEventListener("beforeunload", function (event) { useFallback = false; });
sehingga tidak menimpa jendela.Membangun jawaban di sini dan di sini . Saya pikir, jawaban yang lebih konklusif hanya untuk memeriksa apakah ini adalah halaman baru di tab baru.
Jika riwayat halaman lebih dari satu, maka kita dapat kembali ke halaman sebelumnya ke halaman saat ini. Jika tidak, tab tersebut adalah tab yang baru dibuka dan kita perlu membuat tab baru.
Berbeda dengan jawaban yang ditautkan, kami tidak mengecek a
referrer
karena tab baru masih memiliki referer.sumber
Ada solusi lain yang hampir sempurna, diambil dari jawaban SO lainnya :
Seseorang melaporkan bahwa itu tidak berfungsi saat menggunakan
target="_blank"
tetapi tampaknya bekerja untuk saya di Chrome.sumber
browser memiliki tombol kembali dan maju. Saya menemukan solusi untuk pertanyaan ini. tetapi ini akan memengaruhi tindakan penerusan browser dan menyebabkan bug pada beberapa browser.
Ini berfungsi seperti itu: Jika browser membuka url baru, yang belum pernah dibuka, history.length akan bertambah.
sehingga Anda dapat mengubah hash like
untuk mendapatkan url yang tidak pernah ditampilkan, maka history.length akan mendapatkan panjang sebenarnya.
tetapi, ini tidak selalu bekerja dengan baik, dan saya tidak tahu mengapa, terutama ketika url otomatis melompat dengan cepat.
sumber
Saya sedang berusaha menemukan solusi dan ini adalah yang terbaik yang bisa saya dapatkan (tetapi berfungsi dengan baik dan ini adalah solusi termudah yang pernah saya temukan di sini).
Dalam kasus saya, saya ingin kembali pada sejarah dengan tombol kembali, tetapi jika halaman pertama yang dibuka pengguna adalah subhalaman dari aplikasi saya, itu akan kembali ke halaman utama.
Solusinya adalah, segera setelah aplikasi dimuat, saya baru saja mengganti status sejarah:
Dengan cara ini, saya hanya perlu memeriksa
history.state.root
sebelum kembali. Jika benar, sebagai gantinya saya membuat penggantian riwayat:sumber
sumber
history.back()
adalahundefined
hanya pada halaman tab kosongLarutan
Penjelasan
window.location.pathname
akan memberi Anda URI saat ini. Misalnyahttps://domain/question/1234/i-have-a-problem
akan memberi/question/1234/i-have-a-problem
. Lihat dokumentasi tentang window.location untuk informasi lebih lanjut.Selanjutnya, panggilan untuk
split()
memberi kita semua bagian URI itu. jadi jika kita mengambil URI sebelumnya, kita akan memiliki sesuatu seperti["", "question", "1234", "i-have-a-problem"]
. Lihat dokumentasi tentang String.prototype.split () untuk informasi lebih lanjut.Panggilan ke
filter()
sini untuk menyaring string kosong yang dihasilkan oleh garis miring ke belakang. Ini pada dasarnya hanya akan mengembalikan URI fragmen yang memiliki panjang lebih besar dari 1 (string tidak kosong). Jadi kita akan memiliki sesuatu seperti["question", "1234", "i-have-a-question"]
. Ini bisa ditulis seperti:Lihat dokumentasi tentang Array.prototype.filter () dan tugas Destrukturisasi untuk informasi lebih lanjut.
Sekarang, jika pengguna mencoba untuk kembali saat sedang aktif
https://domain/
, kami tidak akan memicu pernyataan-if, dan karenanya tidak akan memicuwindow.history.back()
metode sehingga pengguna akan tetap berada di situs web kami. URL ini akan sama dengan[]
yang memiliki panjang0
, dan0 > 0
salah. Karenanya, diam-diam gagal. Tentu saja, Anda dapat mencatat sesuatu atau melakukan tindakan lain jika Anda mau.Keterbatasan
Tentu saja, solusi ini tidak akan berfungsi jika browser tidak mendukung API Sejarah . Periksa dokumentasi untuk mengetahui lebih banyak tentang hal itu sebelum menggunakan solusi ini.
sumber
Saya tidak yakin apakah ini berhasil dan benar-benar belum diuji, tetapi coba ini:
Dan di suatu tempat di HTML:
EDIT:
Yang juga dapat Anda lakukan adalah meneliti browser apa yang mendukung fungsi belakang (saya pikir semuanya) dan menggunakan objek deteksi browser JavaScript standar yang ditemukan, dan dijelaskan secara menyeluruh, di halaman ini . Kemudian Anda dapat memiliki 2 halaman berbeda: satu untuk "browser yang baik" yang kompatibel dengan tombol kembali dan satu untuk "browser yang buruk" memberitahu mereka untuk memperbarui browser mereka
sumber
history.back
adalah suatu fungsi. Anda ingin memeriksa apakahhistory.length > 0
kemudian kembali denganhistory.back()
[]
di NodeList tidak masuk akal, dan Anda tidak dapat menetapkan string ke pengendali event.Periksa apakah
window.history.length
sama dengan 0.sumber