2009-09-09 17 views
227

Ich habe URL wie: http://example.com#something, wie entferne ich #something, ohne die Seite zu aktualisieren?Wie entferne ich den Hash von window.location (URL) mit JavaScript ohne Seitenaktualisierung?

ich versuchte, die folgende Lösung:

window.location.hash = ''; 

Allerdings bedeutet dies das Hash-Symbol nicht entfernen # aus der URL.

+3

Wollen Sie das wirklich wollen, zu tun? Es wird eine Seitenaktualisierung verursachen. – seth

+7

Kann auf eine Seitenaktualisierung verzichtet werden? –

+1

Es * ist * möglich. AJAX History Libraries beschäftigen sich damit. Aber es ist nicht einfach, und es muss für fast jeden Browser anders gemacht werden. Nicht etwas, auf das du dich einlassen willst. –

Antwort

156

Erste Frage:

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

oder

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

sowohl die URL ohne den Hash oder irgendetwas, nachdem es zurück.

Mit Bezug auf Ihre edit:

Jede Änderung window.location wird eine Aktualisierung der Seite auslösen. Sie können window.location.hash ändern, ohne die Aktualisierung auszulösen (obwohl das Fenster springt, wenn Ihr Hash mit einer ID auf der Seite übereinstimmt), aber Sie können das Hash-Zeichen nicht loswerden. Treffen Sie Ihre Wahl, für die noch schlimmer ist ...

up-to-DATE ANTWORT

Die richtige Antwort, wie man es tun, ohne zu opfern (entweder volles Nachladen oder Verlassen der Hash-Zeichen gibt) ist down here . Wir haben diese Antwort hier in Bezug auf die ursprüngliche Version von 2009 gelassen, während die korrekte, die neue Browser-APIs nutzt, 1,5 Jahre später gegeben wurde.

+17

Das ist einfach falsch, Sie können ändern window.location.hash und es wird keine Aktualisierung ausgelöst. – Evgeny

+55

@Evgeny - Das sagt meine Antwort.Ich sage ausdrücklich, dass das Ändern von window.location.hash keine Aktualisierung auslöst. "Sie können window.location.hash ändern, ohne die Aktualisierung auszulösen (obwohl das Fenster springt, wenn Ihr Hash mit einer ID auf der Seite übereinstimmt)". –

+2

Keine Seite neu laden - das ist in der Frage. Dies ist nicht die Antwort, da es das erneute Laden einer Seite erfordert. –

440

Die Lösung dieses Problems ist heutzutage viel mehr in Reichweite. Die HTML5 History API ermöglicht es uns, die Adressleiste zu manipulieren, um eine beliebige URL innerhalb der aktuellen Domain anzuzeigen.

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

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

Dies funktioniert in Chrome 9, Firefox 4, Safari 5, Opera 11.50 und in IE 10. Für nicht unterstützten Browser, können Sie immer einen anmutig erniedrigenden Skript schreiben das macht Gebrauch davon, wo verfügbar:

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; 
    } 
} 

So können Sie aus dem Hash-Symbol loszuwerden, nur nicht in allen Browsern — y et.

Hinweis: Wenn Sie die aktuelle Seite im Browserverlauf ersetzen möchten, verwenden Sie replaceState() anstelle von pushState().

+22

sollte dies die beste Antwort sein –

+8

Verwenden Sie diese Zeile, um sicherzustellen, dass Sie nicht verlieren die Abfragezeichenfolge: history.pushState ("", document.title, window.location.Pfadname + window.location.search); –

+5

@Phil: Danke, dass du darauf hingewiesen hast, ich habe die Antwort entsprechend aktualisiert. Ich bin es gewohnt, hübsche URLs zu verwenden. –

1

Versuchen Sie Folgendes:

window.history.back(1); 
+0

yeah seine Arbeit thanx @Vishal Sharma – Jimmy

+19

Dies beantwortet nicht die Frage, ob der Benutzer direkt zu der URL einschließlich des Hashes gekommen ist. – nickb

+0

Dieser Trick ist sehr nützlich, wenn Sie nur einen Link zur vorherigen Seite erstellen möchten, aber der Link ist in einem Bündel von js-Dateien versteckt. – ValidfroM

0

Sie Hash mit null

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

Die Frage fragt "ohne die Seite zu aktualisieren", aber diese Methode aktualisiert die Seite. Sie sollten diese Tatsache in Ihrer Antwort notieren, damit wir nicht alle unsere Zeit damit verschwenden müssen, aus erster Hand herauszufinden, dass Sie eine andere Frage beantworten als diejenige, die wir hier eigentlich beantworten wollen. –

+0

Die Seite wird nicht aktualisiert. – Ciprian

26

Schlicht und elegant ersetzen:

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

Verwenden Sie einen Punkt anstelle eines Schrägstrichs, wenn Sie im selben Verzeichnis bleiben möchten. – vahanpwns

+1

Bitte aktualisieren Sie die Antwort in Bezug auf @vahanpwns Notiz, um '.' Anstelle von '/' zu verwenden. Mit '/' wird die URL zum Root-Pfad geändert. –

+0

Ich habe die Antwort für eine bessere Erklärung von dem, was in dem Beispiel passiert, aktualisiert – vahanpwns

3

Wie wäre es die folgenden?

window.location.hash=' '

Bitte beachten Sie, dass der Hash auf einen einzigen Raum setze und nicht eine leere Zeichenfolge.


Das Setzen des Hashes auf einen ungültigen Anker verursacht auch keine Aktualisierung. Wie

window.location.hash='invalidtag'

Aber ich obige Lösung finden irreführend. Dies scheint darauf hinzuweisen, dass an der gegebenen Position ein Anker mit dem gegebenen Namen existiert, obwohl es keinen gibt. Gleichzeitig bewirkt die Verwendung einer leeren Zeichenfolge, dass die Seite nach oben verschoben wird, was manchmal inakzeptabel sein kann. Die Verwendung eines Leerzeichens stellt außerdem sicher, dass die Seite, wenn die URL kopiert und erneut markiert und erneut besucht wird, normalerweise oben ist und der Speicherplatz ignoriert wird.

Und, hey, das ist meine erste Antwort auf StackOverflow. Hoffe jemand findet es nützlich und es entspricht den Gemeinschaftsstandards.

+5

Setzen von Hash auf Whitespace behält die # am Ende der URL, ich denke, das Ziel ist es, es vollständig zu entfernen. – mahemoff

+0

Es folgt ein Hash am Ende der URL. Die Frage ist, wie man das entfernt. –

2
<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> 

put diesen Code auf Kopfteil

4

Dies wird die hintere Hash auch entfernen. zB: http://test.com/123#abc ->http://test.com/123

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

den Hash zu entfernen, können Sie versuchen, diese Funktion verwenden

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); 
    } 
} 
+0

Arbeitete perfekt für mich, danke! – jovanchohan

0

Hier eine andere Lösung ist die Lage mit href zu ändern und den Hash zu löschen, ohne zu Scrollen.

Die magische Lösung wird erklärt here. Spezifikationen here.

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

HINWEIS: Die vorgeschlagene API ist jetzt Teil von WHATWG HTML Lebensstandard