2985 votes

Comment modifier l'URL sans recharger la page ?

Existe-t-il un moyen de modifier l'URL de la page actuelle sans recharger la page ?

Je voudrais accéder à la partie avant le # hash si possible.

Je dois seulement changer la portion après le domaine, donc ce n'est pas comme si je violais les politiques inter-domaines.

 window.location.href = "www.mysite.com/page2.php";  // Sadly this reloads

186 votes

Pour faciliter la compréhension de la question, voici ce que fait Facebook lorsque vous ouvrez une photo, par exemple. La barre d'adresse change pour pointer DIRECTEMENT vers cette photo, de sorte que vous pouvez partager l'URL sans perdre l'endroit où vous vous trouvez dans le site. Vous vous souvenez des sites basés sur le cadrage de la dernière décennie ? Vous ne pouviez obtenir que l'URL de la page d'accueil, car seuls les cadres internes changeaient. Et c'était terrible.

7 votes

Alors que history.pushState() est probablement la bonne réponse ici, dans cette situation (en fonction des circonstances exactes...), la possibilité d'utiliser une redirection côté serveur (comme via l'utilisation de la directive RewriteRule d'Apache) est quelque chose que vous pourriez envisager, ou du moins connaître. J'ai simplement pensé qu'il fallait le mentionner !

13 votes

window.history.replaceState(null, document.title, "/page2.php") est probablement ce que la plupart des gens recherchent.

22voto

Dheeraj Thedijje Points 799

Vous pouvez utiliser cette belle et simple fonction pour le faire n'importe où dans votre application.

function changeurl(url, title) {
    var new_url = '/' + url;
    window.history.pushState('data', title, new_url);

}

Vous pouvez non seulement modifier l'URL, mais aussi mettre à jour le titre.

1 votes

Fonctionne comme un charme, même pour les ancres window.history.pushState('data', 'Title', '#new_location');

1 votes

Pourquoi n'utilisez-vous pas l'argument 'title' comme titre dans pushState ?

19voto

Suraj Points 1060

Vous trouverez ci-dessous la fonction permettant de modifier l'URL sans recharger la page. Elle n'est prise en charge que pour HTML5.

  function ChangeUrl(page, url) {
        if (typeof (history.pushState) != "undefined") {
            var obj = {Page: page, Url: url};
            history.pushState(obj, obj.Page, obj.Url);
        } else {
            window.location.href = "homePage";
            // alert("Browser does not support HTML5.");
        }
    }

  ChangeUrl('Page1', 'homePage');

2 votes

@Green, page est un titre court pour l'état dans lequel vous déménagez. Firefox ignore actuellement ce paramètre, bien qu'il puisse l'utiliser à l'avenir. Le passage de la chaîne vide ici devrait être sûr contre les changements futurs de la méthode. De : [developer.mozilla.org/fr/US/docs/Web/API/](https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState()_method)

13voto

Gumbo Points 279147

Toute modification de la loction (soit window.location o document.location ) provoquera une requête sur cette nouvelle URL, si vous ne modifiez pas simplement le fragment d'URL. Si vous changez l'URL, vous changez l'URL.

Utilisez des techniques de réécriture d'URL côté serveur telles que Le mod_rewrite d'Apache si vous n'aimez pas les URLs que vous utilisez actuellement.

0 votes

Puis-je utiliser "location.pathname" ? ??

3 votes

Non, la modification de cet attribut entraînera également une demande.

11voto

Nate Points 41

Vous pouvez ajouter des balises d'ancrage. Je l'utilise sur mon site afin de pouvoir suivre avec Google Analytics ce que les gens visitent sur la page.

J'ajoute simplement une balise d'ancrage, puis la partie de la page que je veux suivre :

var trackCode = "/#" + urlencode($("myDiv").text());
window.location.href = "http://www.piano-chords.net" + trackCode;
pageTracker._trackPageview(trackCode);

9voto

Erenor Paz Points 740

Comme l'a fait remarquer Thomas Stjernegaard Jeppesen, vous pouvez utiliser la méthode suivante Histoire.js pour modifier les paramètres des URL pendant que l'utilisateur navigue dans vos liens et applications Ajax.

Près d'un an s'est écoulé depuis cette réponse, et History.js a grandi et est devenu plus stable et multi-navigateur. Il peut désormais être utilisé pour gérer les états de l'historique dans les navigateurs compatibles HTML5 ainsi que dans de nombreux navigateurs HTML4 uniquement. Dans cette démo Vous pouvez voir un exemple de son fonctionnement (ainsi que la possibilité d'essayer ses fonctionnalités et ses limites.

Si vous avez besoin d'aide pour utiliser et mettre en œuvre cette bibliothèque, je vous suggère de jeter un coup d'œil au code source de la page de démonstration : vous verrez que c'est très facile à faire.

Enfin, pour une explication complète des problèmes que peut poser l'utilisation des hachages (et des hashbangs), consultez le document suivant ce lien par Benjamin Lupton.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X