Je voudrais remplacer une URL sans rafraîchissement de la page.
J'ai besoin de changer:
https://example.com/en/step1
à
https://example.com/en/step2
Comment faire ça ?
Mettre à jour
Basé sur manipulant l'historique du navigateur , passer la chaîne vide comme second paramètre de la méthode pushState
( aka title ) devrait être protégé contre les modifications futures. à la méthode, il est donc préférable d'utiliser pushState
comme ceci:
_history.pushState(null, '', '/en/step2');
_
Vous pouvez en savoir plus à ce sujet dans l'article mentionné
Réponse originale
Utilisez _history.pushState
_ comme ceci:
_history.pushState(null, null, '/en/step2');
_
Mise à jour 2 pour répondre Le commentaire de Idan Dagan :
Pourquoi ne pas utiliser
history.replaceState()
?
De MDN
history.replaceState () fonctionne exactement comme history.pushState () sauf que replaceState () modifie l'entrée d'historique actuelle au lieu d'en créer une nouvelle.
Cela signifie que si vous utilisez replaceState
, oui, l'URL sera modifiée, mais l'utilisateur ne peut pas utiliser le bouton Précédent du navigateur pour revenir au précédent. état (s) plus ( parce que replaceState
n’ajoute pas de nouvelle entrée à l’historique ) et que ce n’est pas recommandé et fournit une mauvaise UX.
Mise à jour 3 pour ajouter window.onpopstate
Donc, comme cette réponse a attiré votre attention, voici des informations supplémentaires sur la manipulation de l'historique du navigateur. Après avoir utilisé pushState
, vous pouvez détecter la navigation du bouton Précédent/Suivant à l'aide de _window.onpopstate
_ comme ceci:
_window.onpopstate = function(e) {
// ...
};
_
Comme le premier argument de pushState
est un objet, si vous passez un object
à la place de null
, vous pouvez accéder à cet objet dans onpopstate
, ce qui est très pratique. Voici comment: :
_window.onpopstate = function(e) {
if(e.state) {
console.log(e.state);
}
};
_
Mise à jour 4 pour ajouter lecture de l'état actuel :
Lors du chargement de votre page, elle peut avoir un objet state non null, vous pouvez lire l'état de l'entrée d'historique actuelle sans attendre l'événement popstate
à l'aide de la propriété _history.state
_, comme ceci:
_console.log(history.state);
_
Bonus : Utilisez ce qui suit pour vérifier le support de _history.pushState
_:
_if (history.pushState) {
// \o/
}
_
Lorsque vous utilisez une fonction ...
<p onclick="update_url('/en/step2');">Link</p>
<script>
function update_url(url) {
history.pushState(null, null, url);
}
</script>