Come rimuovere l'hash da window.location (URL) con JavaScript senza aggiornamento della pagina?


332

Ho un URL come:, come http://example.com#somethingrimuovo #something, senza far aggiornare la pagina?

Ho provato la seguente soluzione:

window.location.hash = '';

Tuttavia, ciò non rimuove il simbolo hash #dall'URL.


3
Vuoi davvero farlo? Provocherà un aggiornamento della pagina.
seth

9
È possibile fare a meno di un aggiornamento della pagina?
Tom Lehman,

1
Si è possibile. Le librerie di storia AJAX si occupano di questo. Ma non è facile e deve essere fatto diversamente per quasi tutti i browser. Non qualcosa in cui vuoi entrare.
Gabriel Hurley,

Esistono delle considerazioni per lasciare un "#" diverso da quello visivo?
user29660

Risposte:


210

Domanda iniziale:

window.location.href.substr(0, window.location.href.indexOf('#'))

o

window.location.href.split('#')[0]

entrambi restituiranno l'URL senza l'hash o nulla dopo.

Per quanto riguarda la tua modifica:

Qualsiasi modifica a window.locationattiverà un aggiornamento della pagina. Si può cambiarewindow.location.hash senza attivare l'aggiornamento (anche se la finestra salterà se il tuo hash corrisponde a un ID sulla pagina), ma non puoi liberarti del segno hash. Fai la tua scelta per cui è peggio ...

RISPOSTA PIÙ AGGIORNATA

La risposta giusta su come farlo senza sacrificare (ricaricare completamente o lasciare lì il segno di hash) è qui . Lasciando qui questa risposta rispetto all'originale nel 2009, mentre quella corretta che sfrutta le nuove API del browser è stata data 1,5 anni dopo.


22
Questo è semplicemente sbagliato, puoi cambiare window.location.hash e non attiverà un aggiornamento.
Evgeny,

61
@Evgeny - Ecco cosa dice la mia risposta. Dico esplicitamente che cambiare window.location.hash non attiverà un aggiornamento. "Puoi cambiare window.location.hash senza innescare l'aggiornamento (anche se la finestra salterà se il tuo hash corrisponde a un ID nella pagina)".
Gabriel Hurley,

3
Nessuna ricarica di pagina - questo è nella domanda. Questa non è la risposta in quanto richiede / forza un ricaricamento della pagina!
Ed_

10
anche pensare che non dovrebbe essere il ✓answer
abernier

4
Questa non è una risposta alla domanda del PO.
Bryce,

586

Al giorno d'oggi, risolvere questo problema è molto più a portata di mano. L' API History HTML5 ci consente di manipolare la barra degli indirizzi per visualizzare qualsiasi URL all'interno del dominio corrente.

function removeHash () { 
    history.pushState("", document.title, window.location.pathname
                                                       + window.location.search);
}

Demo funzionante: http://jsfiddle.net/AndyE/ycmPt/show/

Funziona in Chrome 9, Firefox 4, Safari 5, Opera 11.50 e in IE 10. Per i browser non supportati, puoi sempre scrivere uno script con buon degrado che lo usi ove disponibile:

function removeHash () { 
    var scrollV, scrollH, loc = window.location;
    if ("pushState" in history)
        history.pushState("", document.title, loc.pathname + loc.search);
    else {
        // Prevent scrolling by storing the page's current scroll offset
        scrollV = document.body.scrollTop;
        scrollH = document.body.scrollLeft;

        loc.hash = "";

        // Restore the scroll offset, should be flicker free
        document.body.scrollTop = scrollV;
        document.body.scrollLeft = scrollH;
    }
}

Quindi puoi sbarazzarti del simbolo dell'hash, non solo in tutti i browser - ancora.

Nota: se si desidera sostituire la pagina corrente nella cronologia del browser, utilizzare replaceState()invece di pushState().


9
Utilizzare questa riga per assicurarsi di non perdere la stringa di query: history.pushState ("", document.title, window.location.pathname + window.location.search);
Phil Kulak,

6
@Phil: grazie per averlo sottolineato, ho aggiornato la risposta di conseguenza. Sono troppo abituato a usare URL piuttosto carini.
Andy E

1
Per le versioni precedenti di IE, sembra che sia necessario utilizzare document.documentElement anziché document.body. Vedere questa risposta stackoverflow.com/a/2717272/359048
jasonmcclurg

29
Suggerisco di utilizzare ReplaceState invece di pushState, per non creare una voce aggiuntiva nella cronologia del browser.
Nico,

1
@santiagoarizti: hai ragione, sono appena arrivato alla stessa conclusione. Non ho ispezionato correttamente il codice che ho scritto (7 anni fa!) E mi sono perso che stavo anche commutando lo stato del pulsante durante la rimozione dell'hash. Dal momento che stai cambiando l'hash manualmente, suppongo che potresti sempre innescare l'evento tu stesso.
Andy E

85

(Troppe risposte sono ridondanti e obsolete.) La soluzione migliore ora è questa:

history.replaceState(null, null, ' ');

5
utilizzare history.pushState(null, null, ' ')invece se si desidera conservare la cronologia.
nichijou,

9
Potrebbe essere utile spiegare cosa fa il passaggio nullper i parametri statee title.
V. Rubinetti,

Un problema con questo, e il resto, è che non si attiva il cambio di scambio, anche se l'hash è vuoto quando non lo era prima.
Curtis,

1
In TypeScript, null non è consentito per il secondo parametro poiché il comando accetta una stringa. Mozilla consiglia una stringa vuota.
Curtis,

41

Semplice ed elegante:

history.replaceState({}, document.title, ".");  // replace / with . to keep url

3
usa un punto invece di una barra se vuoi rimanere nella stessa directory
vahanpwns

1
Si prega di aggiornare la risposta per quanto riguarda la nota di @vahanpwns, da usare al .posto di /. L'uso /modifica l'URL nel percorso principale.
Isaac Gregson,

5
Grazie per questa risposta, ho modificato il history.replaceState({}, document.title, location.href.substr(0, location.href.length-location.hash.length));mio caso d'uso.
Scott Jungwirth,

5
Questo non conserva la query dell'URL.
Vladislav Kostenko,

2
Il mio caso d'uso era anche quello di sostituire invece di spingere, ma questo ha più senso per me:history.replaceState(null, document.title, location.pathname + location.search);
MDMower

16

Per rimuovere l'hash, puoi provare a usare questa funzione

function remove_hash_from_url()
{
    var uri = window.location.toString();
    if (uri.indexOf("#") > 0) {
        var clean_uri = uri.substring(0, uri.indexOf("#"));
        window.history.replaceState({}, document.title, clean_uri);
    }
}

13

Questo rimuoverà anche l'hash finale. ad es .: http://test.com/123#abc -> http://test.com/123

if(window.history.pushState) {
    window.history.pushState('', '/', window.location.pathname)
} else {
    window.location.hash = '';
}

Ciò rimuove qualsiasi parametro di query presente nell'URL :(
kevgathuku il

1
@kevgathuku puoi aggiungerli nuovamente con location.search, ad esempio: `window.history.pushState ('', '/', window.location.pathname + window.location.search)`
Chris Gunawardena

6

Che ne dici di quanto segue?

window.location.hash=' '

Nota che sto impostando l'hash su un singolo spazio e non su una stringa vuota.


L'impostazione dell'hash su un ancoraggio non valido non provoca neanche un aggiornamento. Ad esempio,

window.location.hash='invalidtag'

Ma trovo che la soluzione di cui sopra sia fuorviante. Questo sembra indicare che esiste un punto di ancoraggio su una determinata posizione con il nome dato sebbene non ce ne sia uno. Allo stesso tempo, l'uso di una stringa vuota fa sì che la pagina si sposti all'inizio, che a volte può essere inaccettabile. L'uso di uno spazio garantisce inoltre che ogni volta che l'URL viene copiato, aggiunto ai segnalibri e visitato di nuovo, la pagina sarà di solito in alto e lo spazio verrà ignorato.

E, ehi, questa è la mia prima risposta su StackOverflow. Spero che qualcuno lo trovi utile e corrisponda agli standard della comunità.


7
L'impostazione dell'hash su spazi bianchi mantiene comunque il # alla fine dell'URL, penso che l'obiettivo sia rimuoverlo del tutto.
mahemoff,

1
Traccia un hash alla fine dell'URL. La domanda è come rimuoverlo.
Gurmeet Singh,

Sì, come possiamo rimuovere anche # con la stringa hash.
Bhavin Thummar,

6

Puoi farlo come di seguito:

history.replaceState({}, document.title, window.location.href.split('#')[0]);


1
La risposta stellata non ha funzionato per me in entrambi i casi, ma questa ha funzionato. Grazie!
Dev

5
const url = new URL(window.location);
url.hash = '';
history.replaceState(null, document.title, url);

2
Mentre questo codice può rispondere alla domanda, fornendo un contesto aggiuntivo riguardo al perché e / o al modo in cui questo codice risponde alla domanda migliora il suo valore a lungo termine.
rollstuhlfahrer

3
<script type="text/javascript">
var uri = window.location.toString();
if (uri.indexOf("?") > 0) {
    var clean_uri = uri.substring(0, uri.indexOf("?"));
    window.history.replaceState({}, document.title, clean_uri);
}
</script>

inserisci questo codice nella sezione head


3
function removeLocationHash(){
    var noHashURL = window.location.href.replace(/#.*$/, '');
    window.history.replaceState('', document.title, noHashURL) 
}

window.addEventListener("load", function(){
    removeLocationHash();
});

2

Penso che sarebbe più sicuro

if (window.history) {
    window.history.pushState('', document.title, window.location.href.replace(window.location.hash, ''));
} else {
    window.location.hash = '';
}

0

Prova quanto segue:

window.history.back(1);

23
Questo non risponde alla domanda se l'utente è arrivato direttamente all'URL incluso l'hash.
Nick

Questo trucco è molto utile quando vuoi solo creare un link alla pagina precedente, ma il link è nascosto in un mucchio di file js.
ValidfroM,

Esattamente quello che stavo cercando. Funziona perfettamente per rimuovere un hashtag appena creato dalla mia app Web al fine di consumare un valore restituito da una funzione javasript.
user278859

0

Ecco un'altra soluzione per cambiare la posizione usando href e cancellare l'hash senza scorrere.

La soluzione magica è spiegata qui . Specifiche qui .

const hash = window.location.hash;
history.scrollRestoration = 'manual';
window.location.href = hash;    
history.pushState('', document.title, window.location.pathname);

NOTA: l'API proposta fa ora parte di WhatWG HTML Living Standard


0
  $(window).on('hashchange', function (e) {
        history.replaceState("", document.title, e.originalEvent.oldURL);
    });

-1

È possibile sostituire l'hash con null

var urlWithoutHash = document.location.href.replace(location.hash , "" );

1
La domanda chiede "senza far aggiornare la pagina", ma questo metodo aggiorna la pagina. Dovresti notare questo fatto nella tua risposta, quindi non tutti dobbiamo perdere tempo a scoprire in prima persona che stai rispondendo a una domanda diversa da quella a cui stiamo effettivamente cercando di ottenere una risposta qui.
Vladimir Kornea,

Non aggiorna la pagina.
Ciprian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.