web-dev-qa-db-fra.com

Suppression du hachage d'URL

Visitez stackoverflow.com/#_=_ Et window.location.hash Est évalué à #_=_. Bien.

Exécutez maintenant window.location.hash = '' Pour effacer le hachage, et l'URL devient stackoverflow.com/#. (Remarquez le # De fin.)

Pourquoi le # Dans window.location.hash Est-il inclus ou exclu de manière incohérente? Comment le # Peut-il être supprimé de l'URL sans recharger la page?

( MDN dit

[le hachage est] la partie de l'URL qui suit le symbole #, y compris le symbole #.

mais ce n'est pas vrai dans le cas d'un hachage vide.)

30
Randomblue

Pour répondre à la deuxième question (en supprimant le # sans actualisation de page):

history.pushState('', document.title, window.location.pathname);
56
Randomblue

Répondre à votre première question:

Selon le window.location doc dans Mozilla.org: "la partie de l'URL qui suit le symbole #, s'il y en a un, y compris le symbole #. Chaîne vide si l'url ne contient pas # ou n'a rien après le #. "

Curieusement, ce document vient d'être mis à jour le 4/8/2013. Je ne sais pas si cela a été ajouté après avoir vérifié la documentation.

Soit dit en passant (et en référence aux réponses), window.location.hash et pushState sont des concepts différents bien que étroitement liés.

4
ricardohdz

Il y a 2 facteurs à l'origine de ce comportement:

  • "La définition de la propriété de hachage permet d'accéder à l'ancre nommée sans recharger le document." ( ici )
  • "Lorsque vous définissez l'objet d'emplacement ou l'une de ses propriétés, sauf le hachage [...] Dans JavaScript 1.1 et versions ultérieures, l'effet de la définition de l'emplacement dépend du paramètre de l'utilisateur pour comparer un document à l'original sur le réseau." ( ici )

Donc, fondamentalement, la définition de la propriété de hachage ne doit jamais conduire à un rechargement, la définition de toute autre propriété doit conduire à un rechargement (ou peut-être une vérification de l'en-tête E-Tag/modifié depuis, en fonction des paramètres du navigateur).

Je suppose que, par souci de cohérence, les constructeurs de navigateurs transforment la définition d'un hachage vide, en définissant "#" comme hachage. De cette façon, l'URL dans la barre d'emplacement ne conduit pas à un rechargement. Mais cette dernière partie n'est que pure spéculation.

0
Claude