Saya khawatir ini mungkin tidak mungkin, tetapi adakah cara untuk mengubah nilai hash URL tanpa meninggalkan entri di riwayat browser dan tanpa memuat ulang ? Atau melakukan yang setara?
Sejauh spesifikasinya, saya sedang mengembangkan beberapa navigasi hash dasar di sepanjang baris:
//hash nav -- works with js-tabs
var getHash = window.location.hash;
var hashPref = "tab-";
function useHash(newHash) {
//set js-tab according to hash
newHash = newHash.replace('#'+hashPref, '');
$("#tabs li a[href='"+ newHash +"']").click();
}
function setHash(newHash) {
//set hash according to js-tab
window.location.hash = hashPref + newHash;
//THIS IS WHERE I would like to REPLACE the location.hash
//without a history entry
}
// ... a lot of irrelavent tabs js and then....
//make tabs work
$("#tabs.js-tabs a").live("click", function() {
var showMe = $(this).attr("href");
$(showMe).show();
setHash(showMe);
return false;
});
//hash nav on ready .. if hash exists, execute
if ( getHash ){
useHash(getHash);
}
Menggunakan jQuery, tentu saja. Idenya adalah bahwa dalam contoh khusus ini 1) membuat pengguna kembali ke setiap perubahan tab dapat secara efektif 'memecah tombol kembali' dengan menumpuk referensi yang tidak perlu, dan 2) tidak mempertahankan tab mana yang saat ini mereka aktifkan jika mereka menekan segarkan gangguan.
Jawaban:
location.replace("#hash_value_here");
berfungsi dengan baik untuk saya sampai saya menemukan bahwa itu tidak berfungsi di iOS Chrome. Dalam hal ini, gunakan:Ingatlah untuk tetap mempertahankan
#
atau bagian terakhir url akan diubah.sumber
window.location.hash = 'my-hash';
diikuti olehhistory.replaceState(undefined, undefined, "#my-hash")
?history.replaceState
berbeda darilocation.replace
?Di atas tampaknya melakukan apa yang Anda cari.
sumber
window.location.replace(('' + window.location).split('#')[0] + '#' + hash);
untuk hanya memperbarui hash<base href ="http://example.com/" />
Jika memang berisi tag dasar , maka ketika Anda menggunakan metode ganti dengan hanya sebuah awalan"#hash_value_here"
itu sebenarnya akan seperti jika Anda mengatakan `location.replace (' example.com/#hash_value_here' ). Ini tampak jelas ketika Anda membacanya di sini, tetapi menjadi masalah ketika Anda berada di halaman dengan fragmen jalur dan tidak menyadari bahwa basis telah ditetapkan.Sunting: Sudah beberapa tahun sekarang, dan browser telah berkembang.
@ Luxiyalu ini jawabannya adalah cara untuk pergi
- Jawaban Lama -
Saya juga berpikir itu tidak mungkin (saat ini). Tetapi mengapa Anda perlu mengubah nilai hash jika Anda tidak akan menggunakannya?
Saya yakin alasan utama mengapa kami menggunakan nilai hash sebagai pemrogram adalah untuk membiarkan pengguna menandai halaman kami, atau untuk menyimpan status dalam riwayat browser. Jika Anda tidak ingin melakukan semua ini, simpan saja status dalam variabel, dan kerjakan dari sana.
Saya pikir alasan menggunakan hash adalah untuk bekerja dengan nilai yang di luar kendali kami. Jika Anda tidak membutuhkannya, maka itu mungkin berarti Anda memiliki segalanya di bawah kendali Anda, jadi simpan saja status dalam variabel dan kerjakan dengannya. (Saya suka mengulang sendiri)
Saya harap ini membantu Anda. Mungkin ada solusi yang lebih mudah untuk masalah Anda.
UPDATE: Bagaimana dengan ini:
window.history.back(1)
, itu akan membuat riwayat kembali dari hash init pertama Anda.Anda mungkin harus menggunakan beberapa tanda, untuk mengetahui apakah entri saat ini dapat "dihapus" dengan kembali, atau jika Anda melewatkan langkah pertama. Dan untuk memastikan, bahwa metode pemuatan untuk "hash" tidak dijalankan, saat Anda memaksakan
history.back
.sumber
?mystate=greatness
), meskipun tidak perlu ajax, Anda dapat menyimpan info untuk dibaca javascript saat menginisialisasi permintaan.Anda selalu dapat membuat event listener untuk menangkap event click di hyperlink dan dalam fungsi callback put e.preventDefault (), yang akan mencegah browser memasukkannya ke dalam sejarah.
sumber