Kami punya beberapa halaman menggunakan ajax untuk memuat konten dan ada beberapa kesempatan di mana kami perlu tautan dalam ke halaman. Alih-alih memiliki tautan ke "Pengguna" dan memberi tahu orang-orang untuk mengklik "pengaturan" lebih baik untuk dapat menautkan orang ke pengaturan user.aspx #
Untuk memungkinkan orang memberi kami tautan yang benar ke bagian (untuk dukungan teknis, dll.) Saya sudah mengaturnya untuk secara otomatis memodifikasi hash di URL setiap kali tombol diklik. Satu-satunya masalah tentu saja adalah ketika ini terjadi, ia juga menggulir halaman ke elemen ini.
Apakah ada cara untuk menonaktifkan ini? Di bawah ini adalah bagaimana saya melakukan ini sejauh ini.
$(function(){
//This emulates a click on the correct button on page load
if(document.location.hash){
$("#buttons li a").removeClass('selected');
s=$(document.location.hash).addClass('selected').attr("href").replace("javascript:","");
eval(s);
}
//Click a button to change the hash
$("#buttons li a").click(function(){
$("#buttons li a").removeClass('selected');
$(this).addClass('selected');
document.location.hash=$(this).attr("id")
//return false;
});
});
Saya berharap return false;
akan menghentikan halaman dari pengguliran - tetapi itu hanya membuat tautan tidak berfungsi sama sekali. Jadi itu baru saja dikomentari untuk sekarang sehingga saya dapat menavigasi.
Ada ide?
Gunakan
history.replaceState
atauhistory.pushState
* untuk mengubah hash. Ini tidak akan memicu lompatan ke elemen terkait.Contoh
Demo di JSFiddle
* Jika Anda ingin riwayat maju dan mundur dukungan
Perilaku sejarah
Jika Anda menggunakan
history.pushState
dan Anda tidak ingin pengguliran halaman saat pengguna menggunakan tombol histori browser (maju / mundur) periksascrollRestoration
pengaturan eksperimental (hanya Chrome 46+) .Dukungan Browser
sumber
replaceState
mungkin cara yang lebih baik untuk pergi ke sini. Perbedaannya adalahpushState
menambahkan item ke riwayat Anda sementarareplaceState
tidak.body
gulungan itu, kadang-kadang itudocumentElement
. Lihat intisari ini oleh Diego PeriniSaya pikir saya mungkin telah menemukan solusi yang cukup sederhana. Masalahnya adalah bahwa hash dalam URL juga merupakan elemen pada halaman yang Anda gulir. jika saya hanya menambahkan beberapa teks ke hash, sekarang tidak lagi merujuk elemen yang ada!
Sekarang URL muncul sebagai
page.aspx#btn_elementID
yang bukan ID asli pada halaman. Saya hanya menghapus "btn_" dan mendapatkan ID elemen yang sebenarnyasumber
/
logis.Cuplikan kode asli Anda:
Ubah ini menjadi:
sumber
hash
properti akan membuat halaman tetap bergulir.Saya baru-baru ini membangun sebuah korsel yang mengandalkan
window.location.hash
untuk mempertahankan keadaan dan membuat penemuan bahwa Chrome dan browser webkit akan memaksa pengguliran (bahkan ke target yang tidak terlihat) dengan brengsek canggung ketikawindow.onhashchange
acara dipecat.Bahkan berusaha mendaftarkan pawang yang menghentikan propagasi:
Tidak melakukan apa pun untuk menghentikan perilaku browser default. Solusi yang saya temukan digunakan
window.history.pushState
untuk mengubah hash tanpa memicu efek samping yang tidak diinginkan.Anda kemudian dapat mendengarkan acara hashchange normal dan
my.hashchange
:sumber
my.hashchange
hanya contoh nama acaraOke, ini adalah topik yang agak lama tapi saya pikir saya akan memasukkannya sebagai jawaban 'benar' tidak bekerja dengan baik dengan CSS.
Solusi ini pada dasarnya mencegah acara klik dari memindahkan halaman sehingga kita bisa mendapatkan posisi gulir terlebih dahulu. Kemudian kami secara manual menambahkan hash dan browser secara otomatis memicu acara hashchange . Kami menangkap acara hashchange dan gulir kembali ke posisi yang benar. Panggilan balik memisahkan dan mencegah kode Anda menyebabkan penundaan dengan menjaga peretasan hash Anda di satu tempat.
sumber
Eh saya punya metode yang agak kasar tapi pasti bisa.
Cukup simpan posisi gulir saat ini dalam variabel temp dan kemudian atur ulang setelah mengubah hash. :)
Jadi untuk contoh aslinya:
sumber
Saya rasa ini tidak mungkin. Sejauh yang saya tahu, satu-satunya waktu browser tidak gulir ke perubahan
document.location.hash
adalah jika hash tidak ada di dalam halaman.Artikel ini tidak terkait langsung dengan pertanyaan Anda, tetapi membahas perilaku perubahan browser yang khas
document.location.hash
sumber
jika Anda menggunakan acara hashchange dengan parser hash, Anda dapat mencegah tindakan default pada tautan dan mengubah location.hash menambahkan satu karakter untuk memiliki perbedaan dengan properti id dari suatu elemen
sumber
Menambahkan ini di sini karena semua pertanyaan yang lebih relevan telah ditandai sebagai duplikat yang menunjuk ke sini ...
Situasi saya lebih sederhana:
a[href='#something']
)e.preventDefault()
$("html,body").stop(true,true).animate({ "scrollTop": linkoffset.top }, scrollspeed, "swing" );
window.location = link;
Dengan cara ini, gulir terjadi, dan tidak ada lompatan ketika lokasi diperbarui.
sumber
Cara lain untuk melakukan ini adalah dengan menambahkan div yang tersembunyi di bagian atas viewport. Div ini kemudian diberi id hash sebelum hash ditambahkan ke url .... jadi Anda tidak mendapatkan gulungan.
sumber
Inilah solusi saya untuk tab yang mengaktifkan riwayat:
Dan untuk menampilkan tab yang terakhir dipilih:
Perhatikan
*=
padafilter
panggilan. Ini adalah hal khusus jQuery, dan tanpanya, tab yang didukung riwayat Anda akan gagal.sumber
Solusi ini menciptakan div di scrollTop yang sebenarnya dan menghapusnya setelah mengubah hash:
opsional, memicu peristiwa jangkar saat memuat halaman:
sumber
Saya memiliki metode yang lebih sederhana yang berfungsi untuk saya. Pada dasarnya, ingat apa hash sebenarnya dalam HTML. Ini tautan jangkar ke tag Nama. Itu sebabnya ia menggulir ... browser berusaha untuk menggulir ke tautan jangkar. Jadi, berikan satu!
Beri nama div bagian Anda dengan kelas, bukan ID.
Dalam kode pemrosesan Anda, lepaskan tanda pagar dan ganti dengan titik:
Akhirnya, hapus element.preventDefault atau return: false dan biarkan nav terjadi. Jendela akan tetap di atas, hash akan ditambahkan ke url bilah alamat, dan panel yang benar akan terbuka.
sumber
Saya pikir Anda perlu mengatur ulang gulir ke posisinya sebelum hashchange.
sumber
Jika pada halaman Anda menggunakan id sebagai semacam anchor point, dan Anda memiliki skenario di mana Anda ingin pengguna menambahkan #sesuatu di akhir url dan minta halaman gulir ke bagian #something dengan menggunakan animasi yang Anda tentukan sendiri fungsi javascript, pendengar acara hashchange tidak akan bisa melakukan itu.
Jika Anda cukup meletakkan debugger segera setelah acara hashchange, misalnya, sesuatu seperti ini (well, saya menggunakan jquery, tetapi Anda mendapatkan intinya):
Anda akan melihat bahwa segera setelah Anda mengubah url dan menekan tombol enter, halaman berhenti di bagian yang sesuai segera, hanya setelah itu, fungsi gulir yang Anda tentukan sendiri akan dipicu, dan itu semacam gulir ke bagian itu, yang terlihat sangat buruk.
Saran saya adalah:
jangan gunakan id sebagai titik jangkar Anda ke bagian yang ingin Anda gulir.
Jika Anda harus menggunakan ID, seperti yang saya lakukan. Sebagai gantinya, gunakan pendengar acara 'popstate', itu tidak akan secara otomatis menggulir ke bagian yang Anda tambahkan ke url, sebagai gantinya, Anda dapat memanggil fungsi yang Anda tentukan sendiri di dalam acara popstate.
$(window).on('popstate', function(){myscrollfunction()});
Akhirnya Anda perlu melakukan sedikit trik dalam fungsi gulir yang Anda tentukan sendiri:
hapus id pada tag Anda dan setel ulang.
Ini harus melakukan trik.
sumber
Hanya tambahkan kode ini ke jQuery pada dokumen yang siap
Ref: http://css-tricks.com/snippets/jquery/smooth-scrolling/
sumber