Posso aggiornare window.location.hash senza scorrere la pagina Web?
-
22-07-2019 - |
Domanda
Usando JavaScript, c'è un modo per aggiornare window.location.hash senza scorrere la pagina web?
Ho elementi del titolo cliccabili che attivano la visibilità di un div direttamente sotto di loro. Voglio la barra / foo # nella cronologia quando faccio clic sui titoli ma non voglio che la pagina scorra. Quindi, quando mi allontano da / foo # bar, sarò in grado di usare il pulsante Indietro e avere il div il cui ID è in window.location.hash essere visibile al ritorno.
Questo comportamento è possibile?
Soluzione
Questo comportamento è molto possibile. Dovresti esaminare alcune delle librerie che sono state sviluppate per darti questa funzionalità.
Storia davvero semplice: http://code.google.com/p/reallysimplehistory/ Indirizzo SWF: http://www.asual.com/swfaddress/
Altri suggerimenti
Per cambiare l'hash senza dover ricaricare / scorrere la pagina, ora puoi semplicemente usare html5 history.pushState
.
history.pushState(null,null,'#hashexample');
È supportato da tutti i principali browser:
MDN:
Nota anche che l'ultimo parametro url che stiamo usando qui, può essere qualsiasi url, quindi non si limita agli hash.
Facile come si arriva
var scrollmem = $('html,body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
Un'altra cosa che potresti provare è cambiare temporaneamente l'id dell'elemento a cui punta l'hash. Ha funzionato per me!
function changeHashWithoutScrolling(hash) {
var id = hash.replace(/^.*#/, ''),
elem = document.getElementById(id)
elem.id = id+'-tmp'
window.location.hash = hash
elem.id = id
}
Volevo aggiungere un commento alla risposta di Catherines ma non ho ancora il rappresentante -
Ottima soluzione, tuttavia per Chrome non funzionava come $ ('html'). scrollTop () restituisce sempre 0 - una modifica minore risolve il problema:
scrollmem = $('html').scrollTop() || $('body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
Basandomi sulla risposta di Sunny ho realizzato questa funzione che evita anche indefiniti e nulli:
function changeHashWithoutScrolling(hash) {
var id;
var elem;
id = hash.replace(/^.*#/, '');
if (id) {
elem = document.getElementById(id);
if (elem) {
elem.id = id + '-tmp';
window.location.hash = hash;
elem.id = id;
}
}
}