Bagaimana saya dapat memeriksa apakah suatu URL telah berubah dalam JavaScript? Misalnya, situs web seperti GitHub, yang menggunakan AJAX, akan menambahkan informasi halaman setelah simbol # untuk membuat URL unik tanpa memuat ulang halaman. Apa cara terbaik untuk mendeteksi jika URL ini berubah?
- Apakah
onload
acara dipanggil lagi? - Apakah ada pengendali acara untuk URL?
- Atau haruskah URL diperiksa setiap detik untuk mendeteksi perubahan?
javascript
ajax
AJ00200
sumber
sumber
Jawaban:
Di browser modern (IE8 +, FF3.6 +, Chrome), Anda dapat mendengarkan
hashchange
acara tersebutwindow
.Di beberapa browser lama, Anda perlu timer yang terus-menerus memeriksa
location.hash
. Jika Anda menggunakan jQuery, ada plugin yang melakukan hal itu.sumber
beforeunload
peristiwa. Jika kode Anda memulai perubahan URL, ia tahu yang terbaik.Saya ingin dapat menambahkan
locationchange
pendengar acara. Setelah modifikasi di bawah, kita akan dapat melakukannya, seperti iniSebaliknya,
window.addEventListener('hashchange',()=>{})
hanya akan menyala jika bagian setelah tagar di url berubah, danwindow.addEventListener('popstate',()=>{})
tidak selalu berfungsi.Modifikasi ini, mirip dengan jawaban Christian , memodifikasi objek sejarah untuk menambahkan beberapa fungsi.
Secara default, ada
popstate
acara, tetapi tidak ada acara untukpushstate
, danreplacestate
.Ini memodifikasi ketiga fungsi ini sehingga semua menjalankan
locationchange
acara khusus untuk Anda gunakan, dan jugapushstate
danreplacestate
acara jika Anda ingin menggunakannya:sumber
gunakan kode ini
dengan jQuery
sumber
EDIT setelah sedikit meneliti:
Sepertinya saya tertipu oleh dokumentasi yang ada di Mozilla docs. The
popstate
event (dan fungsi callback nyaonpopstate
) yang tidak dipicu setiap kalipushState()
ataureplaceState()
disebut dalam kode. Karenanya jawaban asli tidak berlaku dalam semua kasus.Namun ada cara untuk menghindari ini dengan menambal fungsi-fungsi menurut @ alpha123 :
Jawaban asli
Mengingat bahwa judul pertanyaan ini adalah " Bagaimana mendeteksi perubahan URL " jawabannya, ketika Anda ingin tahu kapan path lengkap berubah (dan bukan hanya anchor hash), adalah Anda dapat mendengarkan
popstate
acara:Referensi untuk popstate di Mozilla Docs
Saat ini (Jan 2017) ada dukungan untuk popstate dari 92% browser di seluruh dunia.
sumber
Dengan jquery (dan plug-in) yang bisa Anda lakukan
http://benalman.com/projects/jquery-hashchange-plugin/
Kalau tidak ya, Anda harus menggunakan setInterval dan memeriksa perubahan dalam acara hash (window.location.hash)
Memperbarui! Draf sederhana
sumber
window.addEventListener("hashchange", hashChanged);
detect()
fungsi?Tambahkan hash ubah pendengar acara!
Atau, untuk mendengarkan semua perubahan URL:
Ini lebih baik daripada sesuatu seperti kode di bawah ini karena hanya satu hal yang bisa ada di window.onhashchange dan Anda mungkin akan menimpa kode orang lain.
sumber
solusi ini bekerja untuk saya:
sumber
setInterval
menjadisetTimeout
: "menggunakan setInterval () akan membuat Browser berhenti setelah beberapa saat, karena itu akan membuat panggilan baru untuk memeriksaURLchange () setiap detik. setTimeout () adalah solisi yang benar, karena itu disebut hanya sekali. "setTimeout
seperti @divibisan menyarankan, pindahkan bagiansetInterval
luar fungsi.checkURLchange();
juga menjadi opsional.Meskipun merupakan pertanyaan lama, proyek Location-bar sangat berguna.
sumber
Untuk mendengarkan perubahan url, lihat di bawah:
Gunakan gaya ini jika Anda bermaksud untuk menghentikan / menghapus pendengar setelah beberapa kondisi tertentu.
sumber
Saat melakukan sedikit ekstensi chrome, saya menghadapi masalah yang sama dengan masalah tambahan: Kadang-kadang, halaman berubah tetapi tidak URL.
Misalnya, cukup buka Beranda Facebook, dan klik tombol 'Beranda'. Anda akan memuat ulang halaman tetapi URL tidak akan berubah (gaya aplikasi satu halaman).
99% dari waktu, kami mengembangkan situs web sehingga kami bisa mendapatkan acara tersebut dari Kerangka seperti Angular, React, Vue dll.
TAPI , dalam kasus ekstensi Chrome saya (di Vanilla JS), saya harus mendengarkan acara yang akan memicu untuk setiap "perubahan halaman", yang umumnya dapat ditangkap oleh URL yang diubah, tetapi kadang-kadang tidak.
Solusi buatan saya adalah sebagai berikut:
Jadi pada dasarnya solusi leoneckert, diterapkan pada window history, yang akan berubah ketika suatu halaman berubah dalam satu aplikasi halaman.
Bukan ilmu roket, tetapi solusi terbersih yang saya temukan, mengingat kita hanya memeriksa kesetaraan bilangan bulat di sini, dan bukan objek yang lebih besar atau seluruh DOM.
sumber
window.history
memiliki panjang maksimal 50 (setidaknya pada Chrome 80). Setelah itu,window.history.length
selalu kembali 50. Ketika itu terjadi, metode ini akan gagal mengenali perubahan apa pun.Lihatlah fungsi jQuery unload. Ini menangani semua hal.
https://api.jquery.com/unload/
sumber
sumber
Jawaban di bawah ini berasal dari sini (dengan sintaks javascript lama (tidak ada fungsi panah, mendukung IE 10+)): https://stackoverflow.com/a/52809105/9168962
sumber
Cara sederhana lain yang dapat Anda lakukan adalah dengan menambahkan acara klik, melalui nama kelas ke jangkar tag pada halaman untuk mendeteksi kapan telah diklik, maka Anda sekarang dapat menggunakan window.location.href untuk mendapatkan data url yang Anda dapat menggunakan untuk menjalankan permintaan ajax Anda ke server. Sederhana dan Mudah.
sumber
Anda memulai yang baru
setInterval
di setiap panggilan, tanpa membatalkan yang sebelumnya - mungkin Anda hanya bermaksud memilikisetTimeout
sumber