43 votes

Suppression du fragment dans l'URL avec JavaScript sans provoquer de rechargement de la page

Le contexte : J'ai une page HTML qui permet de développer certains contenus. Comme seules de petites parties de la page doivent être chargées pour une telle expansion, cela se fait via JavaScript, et non en dirigeant vers une nouvelle URL/page HTML. Cependant, en prime, l'utilisateur peut établir un lien vers ces sections étendues, c'est-à-dire envoyer à quelqu'un d'autre une URL du type

http://example.com/#foobar

et faire en sorte que la catégorie "foobar" soit ouverte immédiatement pour cet autre utilisateur. Cela fonctionne en utilisant parent.location.hash = 'foobar', donc cette partie est correcte.

Maintenant la question : Lorsque l'utilisateur ferme une telle catégorie sur la page, je veux vider à nouveau le fragment d'URL, c'est-à-dire le transformer. http://example.com/#foobar en http://example.com/ pour mettre à jour l'affichage des permaliens. Cependant, en utilisant parent.location.hash = '' entraîne un rechargement de toute la page (dans Firefox 3, par exemple), ce que j'aimerais éviter. Utilisation de window.location.href = '/#' ne déclenche pas le rechargement de la page, mais laisse le signe "#" dans l'URL. Existe-t-il donc un moyen, dans les navigateurs les plus courants, de supprimer en JavaScript une ancre URL incluant le signe "#" sans déclencher un rafraîchissement de la page ?

0voto

Alors, utilisez

parent.location.hash = '' premièrement

alors faire

window.location.href=window.location.href.slice(0, -1);

-1voto

Florin Points 673
$(document).ready(function() {
        $(".lnk").click(function(e) {
            e.preventDefault();
            $(this).attr("href", "stripped_url_via_desired_regex");
        });
    });

-2voto

balupton Points 17805

Comme d'autres l'ont dit, vous ne pouvez pas le faire. De plus... sérieusement, comme le jQuery Ajaxy auteur - J'ai déployé des sites Web complets en ajax depuis des années maintenant - et je peux garantir qu'aucun utilisateur final ne s'est jamais plaint ou peut-être même n'a jamais remarqué qu'il y avait ce truc de hachage, les utilisateurs s'en fichent tant que ça fonctionne et qu'ils obtiennent ce qu'ils sont venus chercher.

Une solution appropriée est cependant HTML5 PushState/ReplaceState/PopState ;-) qui n'a plus besoin de l'identificateur de fragment : https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history Pour un projet compatible HTML5 et HTML4 qui prend en charge cette fonctionnalité d'état HTML5, consultez le site suivant https://github.com/browserstate/History.js :-)

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