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.

2408voto

David Murdoch Points 28521

Cela peut maintenant être fait dans Chrome, Safari, Firefox 4+, et Internet Explorer 10pp4+ !

Voir la réponse à cette question pour plus d'informations : Mise à jour de la barre d'adresse avec la nouvelle URL sans hachage ni rechargement de la page

Exemple :

 function processAjaxData(response, urlPath){
     document.getElementById("content").innerHTML = response.html;
     document.title = response.pageTitle;
     window.history.pushState({"html":response.html,"pageTitle":response.pageTitle},"", urlPath);
 }

Vous pouvez alors utiliser window.onpopstate pour détecter la navigation du bouton de retour/avance :

window.onpopstate = function(e){
    if(e.state){
        document.getElementById("content").innerHTML = e.state.html;
        document.title = e.state.pageTitle;
    }
};

Pour un examen plus approfondi de la manipulation de l'historique du navigateur, voir cet article du MDN .

12 votes

Veuillez noter que l'OP indique clairement qu'ils sont ne pas essayer de naviguer vers une origine différente ; "ce n'est pas comme si je violais les politiques inter-domaines." -- cependant, je Je suis essayer de le faire, et le window.history API ne permet pas la navigation inter-origine via pushState (ce qui est raisonnable... comme l'indique le site de Mozilla, " La nouvelle URL doit avoir la même origine que l'URL actuelle ; sinon, pushState() lèvera une exception ").

1 votes

Puis-je demander quelle est la valeur de response.html ? Est-ce une chaîne de caractères HTML ?

3 votes

Quelles données doivent être transmises à "response" ?

831voto

Vivart Points 4641

HTML5 a introduit le history.pushState() y history.replaceState() qui vous permettent d'ajouter et de modifier les entrées de l'historique, respectivement.

window.history.pushState('page2', 'Title', '/page2.php');

Pour en savoir plus aquí

3 votes

C'est la solution la plus simple et la plus propre.

3 votes

Excellente réponse, vous pouvez également modifier l'historique actuel plutôt que d'en ajouter un autre, en utilisant replaceState() ; developer.mozilla.org/fr/US/docs/Web/API/History_API/

1 votes

Je reçois A history state object with URL 'file:///C:/Users/.../newUrl' cannot be created in a document with origin 'null' and URL 'file:///C:/Users/.../oldUrl.pdf' . Est-ce parce qu'il s'agit d'une URL de disque local ?

217voto

geo1701 Points 3269

Vous pouvez également utiliser HTML5 replaceState si vous voulez changer l'url mais ne voulez pas ajouter l'entrée à l'historique du navigateur :

if (window.history.replaceState) {
   //prevents browser from storing history with each change:
   window.history.replaceState(statedata, title, url);
}

Cela aurait pour effet de "casser" la fonctionnalité du bouton retour. Cela peut s'avérer nécessaire dans certains cas, par exemple dans une galerie d'images (où vous souhaitez que le bouton retour renvoie à la page d'index de la galerie au lieu de revenir à chaque image que vous avez consultée), tout en donnant à chaque image sa propre URL.

187voto

Haimei Points 328

Voici ma solution (newUrl est votre nouvelle URL que vous voulez remplacer par l'actuelle) :

history.pushState({}, null, newUrl);

9 votes

Le mieux est de tester d'abord avec if (history.pushState) {} Juste au cas où le vieux navigateur.

1 votes

Cela ne fonctionne plus vous obtiendrez dans Firefox : L'opération n'est pas sécurisée.

0 votes

Et l'utilisateur peut même définir un signet avec cette approche, magnifique ! Je peux maintenant mettre à jour l'url en fonction de l'entrée de l'utilisateur et il peut directement créer un signet, quels que soient ses paramètres.

119voto

Robin Day Points 39440

NOTE : Si vous travaillez avec un navigateur HTML5, vous devez ignorer cette réponse. C'est maintenant possible comme vous pouvez le voir dans les autres réponses.

Il n'y a aucun moyen de modifier le URL dans le navigateur sans recharger la page. L'URL représente ce qu'était la dernière page chargée. Si vous la modifiez ( document.location ), la page sera rechargée.

Une raison évidente étant, vous écrivez un site sur www.mysite.com qui ressemble à une page de connexion bancaire. Ensuite, vous changez la barre d'URL du navigateur pour qu'elle dise www.mybank.com . L'utilisateur ne sera pas du tout conscient qu'il est en train de regarder www.mysite.com .

7 votes

Supprimer ou ajouter html4, car actuellement il s'affiche dans la recherche google comme réponse rapide

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