Saya sudah memasang panel geser di situs web saya.
Ketika selesai animasi, saya mengatur hash seperti itu
function() {
window.location.hash = id;
}
(ini adalah panggilan balik, dan id
ditugaskan sebelumnya).
Ini berfungsi baik, untuk memungkinkan pengguna untuk menandai panel, dan juga untuk versi non JavaScript untuk bekerja.
Namun, ketika saya memperbarui hash, browser melompat ke lokasi. Saya kira ini adalah perilaku yang diharapkan.
Pertanyaan saya adalah: bagaimana saya bisa mencegah ini? Yaitu bagaimana saya bisa mengubah hash jendela, tetapi tidak memiliki browser gulir ke elemen jika hash ada? Semacam event.preventDefault()
itu?
Saya menggunakan jQuery 1.4 dan plugin scrollTo .
Terimakasih banyak!
Memperbarui
Berikut adalah kode yang mengubah panel.
$('#something a').click(function(event) {
event.preventDefault();
var link = $(this);
var id = link[0].hash;
$('#slider').scrollTo(id, 800, {
onAfter: function() {
link.parents('li').siblings().removeClass('active');
link.parent().addClass('active');
window.location.hash = id;
}
});
});
javascript
jquery
hash
scrollto
alex
sumber
sumber
event.preventDefault()
:)Jawaban:
Ada solusi dengan menggunakan API riwayat di peramban modern dengan mundur pada yang lama:
Kredit diberikan kepada Lea Verou
sumber
history.replaceState
(yang, untuk perubahan hash, mungkin lebih masuk akal) untuk menghindari kebutuhanpopstate
pendengar acara.hashchange
acara. Itu adalah sesuatu yang harus saya atasi.hashchange
acaraMasalahnya adalah Anda mengatur window.location.hash ke atribut ID elemen. Ini adalah perilaku yang diharapkan untuk browser untuk melompat ke elemen itu, terlepas dari apakah Anda "mencegahDefault ()" atau tidak.
Salah satu cara untuk mengatasi ini adalah dengan awalan hash dengan nilai arbitrary seperti:
Kemudian, yang perlu Anda lakukan adalah memeriksa hash yang diawali pada pemuatan halaman. Sebagai bonus tambahan, Anda bahkan dapat menggulirkannya dengan lancar karena Anda sekarang mengendalikan nilai hash ...
Jika Anda ingin ini berfungsi setiap saat (dan tidak hanya pada pemuatan halaman awal), Anda dapat menggunakan fungsi untuk memantau perubahan pada nilai hash dan melompat ke elemen yang benar dengan cepat:
sumber
Solusi murah dan tidak menyenangkan .. Gunakan # yang jelek! gaya.
Untuk mengaturnya:
Untuk membacanya:
Karena tidak cocok dan berlabuh atau id di halaman, itu tidak akan melompat.
sumber
window.location.hash = '#/' + id;
dan kemudian menggantinya dengan:window.location.hash.replace(/^#\//, '#');
akan sedikitprojects/#/tab1
Mengapa Anda tidak mendapatkan posisi gulir saat ini, memasukkannya ke dalam variabel kemudian menetapkan hash dan meletakkan halaman gulir kembali ke tempat itu:
ini seharusnya bekerja
sumber
Saya menggunakan kombinasi solusi Attila Fulop (Lea Verou) untuk browser modern dan solusi Gavin Brock untuk browser lama sebagai berikut:
Seperti yang diamati oleh Gavin Brock, untuk mendapatkan kembali id Anda harus memperlakukan string (yang dalam hal ini dapat memiliki atau tidak "!") Sebagai berikut:
Sebelum itu, saya mencoba solusi yang mirip dengan yang diusulkan oleh user706270, tetapi tidak bekerja dengan baik dengan Internet Explorer: karena mesin Javascript-nya tidak terlalu cepat, Anda dapat melihat peningkatan dan penurunan gulir, yang menghasilkan efek visual yang buruk.
sumber
Solusi ini bekerja untuk saya.
Masalah dengan pengaturan
location.hash
adalah bahwa halaman akan melompat ke id jika ditemukan di halaman.Masalahnya
window.history.pushState
adalah ia menambahkan entri ke riwayat untuk setiap tab yang diklik pengguna. Kemudian ketika pengguna mengklikback
tombol, mereka pergi ke tab sebelumnya. (ini mungkin atau mungkin bukan yang Anda inginkan. bukan itu yang saya inginkan).Bagi saya,
replaceState
adalah pilihan yang lebih baik karena hanya mengganti riwayat saat ini, jadi ketika pengguna mengklikback
tombol, mereka pergi ke halaman sebelumnya.Lihat dokumentasi API Sejarah di MDN.
sumber
Saya tidak yakin apakah Anda dapat mengubah elemen asli tetapi bagaimana dengan beralih dari menggunakan id attr ke sesuatu yang lain seperti data-id? Kemudian cukup baca nilai data-id untuk nilai hash Anda dan itu tidak akan melompat.
sumber
Solusi ini berhasil untuk saya
Dan kode js lengkap saya adalah
sumber
Saat menggunakan framework laravel, saya memiliki beberapa masalah dengan menggunakan fungsi route-> back () karena menghapus hash saya. Untuk menjaga hash saya, saya membuat fungsi sederhana:
dan saya mengaturnya di fungsi JS saya yang lain seperti ini:
Anda dapat memberi nama nilai penyimpanan lokal Anda sesuka Anda; nama saya
hash
.Karena itu, jika hash diatur pada PAGE1 dan kemudian Anda menavigasi ke PAGE2; hash akan dibuat kembali pada PAGE1 ketika Anda mengklik Kembali pada PAGE2.
sumber