2013-03-10 3 views
29

Besuchen Sie stackoverflow.com/#_=_ und window.location.hash wertet #_=_ aus. Fein.URL-Hash löschen

Führen Sie jetzt window.location.hash = '' aus, um den Hash zu löschen, und die URL wird stackoverflow.com/#. (Beachten Sie die nachfolgenden

Warum ist die in window.location.hash inkonsistent enthalten oder ausgeschlossen? Wie kann die # aus der URL entfernt werden, ohne die Seite neu zu laden?

(MDN sagt

[die Hash ist] der Teil der URL, der das Symbol #, darunter das Symbol # folgt.

aber das ist nicht wahr, denn im Fall von eine leere Hash)

+0

Mit dem Browser haben beobachten Sie dieses Verhalten? – Gumbo

+0

Besuch 'stackoverflow.com/#' führt auch zu 'window.location.hash === ''' so ist es konsistent Verhalten. –

+0

Sie sagen, dass das Manipulieren von 'hash' mit JavaScript zu' # 'in URL und leerer' hash' Eigenschaft führt. Jetzt führt das Aufrufen einer Seite mit nur "#" in URL auch zu einer leeren Hash-Eigenschaft. Die 'hash' -Eigenschaft wird nur gefüllt, wenn nach '#' in der URL andere Zeichen stehen und das Verhalten in allen Browsern konsistent ist. –

Antwort

53

die zweite Frage zu beantworten (die # ohne Aktualisierung der Seite zu entfernen):

history.pushState('', document.title, window.location.pathname); 
+3

Hinweis: pushstate ist IE10 und höher. –

+4

Ich bevorzuge 'replaceState', um dies zu erreichen. – Banago

+2

Gibt es eine Lösung für IE9? Ich habe versucht 'window.location.href.replace (/#.*/," ");' aber es lädt die Seite neu. –

0

Es gibt 2 Dinge fahren dieses Verhalten:.

  • "Wenn die Hash-Eigenschaft festgelegt wird, wird zum benannten Anker navigiert, ohne das Dokument erneut zu laden." (here)
  • "Wenn Sie das Standortobjekt oder eine seiner Eigenschaften außer Hash festlegen [...] In JavaScript 1.1 und später hängt die Wirkung der Einstellung Speicherort von der Einstellung des Benutzers zum Vergleichen eines Dokuments mit dem Original über die Netzwerk." (here)

Also im Grunde sollte die Hash-Eigenschaft nie zu einem Reload führen, andere Eigenschaft auf einen Reload führen sollte (oder vielleicht einen E-Tag/Modified-Since Header zu überprüfen, je nach Browser-Einstellungen).

Ich würde annehmen, dass aus Gründen der Konsistenz, Browser-Builder die Einstellung eines leeren Hash zu setzen, um '#' als Hash zu setzen. Auf diese Weise führt die URL in der Adressleiste nicht zu einem Neuladen. Aber dieser letzte Teil ist reine Spekulation.

4

auf Ihre erste Frage zu beantworten:

Nach dem window.location doc in Mozilla.org: „der Teil die URL, die das Symbol # folgt, wenn es einen gibt, darunter das Symbol #. leeren String, wenn die URL nicht # enthält oder hat nichts hinter dem #. "

Seltsamerweise wurde dieses Dokument gerade am 8.04.2013 aktualisiert. Nicht sicher, ob das hinzugefügt wurde, nachdem Sie die Dokumentation überprüft haben.

Übrigens, die window.location.hash und pushState sind unterschiedliche Konzepte, obwohl sie eng verwandt sind.

-1

Ich habe das gleiche Problem vor zwei Wochen behandelt und meine Schlussfolgerung war, dass es keine gute Lösung gab. Es gibt keine direkte Lösung, das Entfernen des Hashs aus der URL zwang den Browser immer dazu, die Seite neu zu laden, und selbst wenn es eine ungeeignete hackähnliche Lösung gäbe, würde ich den Hash lieber am Ende der URL haben als mit obskuren Lösungen.