105 votes

Pouvez-vous utiliser la navigation par hachage sans affecter l'histoire?

J'ai peur qu'il pourrait être impossible , mais est-il un moyen de changer la valeur de hachage d'une URL sans laisser une entrée dans l'historique du navigateur et sans avoir à recharger? Ou faire l'équivalent?

Ce qui est des détails, j'étais en développement de base de hachage de la navigation le long des lignes de:

//hash nav -- works with js-tabs
var getHash = window.location.hash;
var hashPref = "tab-";
function useHash(newHash) {
    //set js-tab according to hash
    newHash = newHash.replace('#'+hashPref, '');
    $("#tabs li a[href='"+ newHash +"']").click();
}
function setHash(newHash) {
    //set hash according to js-tab
    window.location.hash = hashPref + newHash;

    //THIS IS WHERE I would like to REPLACE the location.hash
    //without a history entry

}
    // ... a lot of irrelavent tabs js and then....

    //make tabs work
    $("#tabs.js-tabs a").live("click", function() {
        var showMe = $(this).attr("href");
        $(showMe).show();
        setHash(showMe);
        return false;
    });
    //hash nav on ready .. if hash exists, execute
    if ( getHash ){
        useHash(getHash);
    }

À l'aide de jQuery, évidemment. L'idée est que dans ce cas précis 1) faire en sorte que l'utilisateur de revenir sur chaque onglet changement pourrait effectivement se "briser le bouton de retour" par empilement inutile de références, et 2) ne pas retenir l'onglet dont ils sont actuellement sur si ils ont frappé l'actualisation est une gêne.

109voto

Lucia Points 107

location.replace("#hash_value_here"); a bien fonctionné pour moi jusqu'à ce que j'ai trouvé que cela ne fonctionne pas sur IOS Chrome. Dans ce cas, utilisez:

history.replaceState(undefined, undefined, "#hash_value")

l'histoire.replaceState() fonctionne exactement comme l'histoire.pushState (), sauf que replaceState() modifie le courant de l'histoire de l'entrée au lieu d'en créer un nouveau.

N'oubliez pas de garder l' # ou de la dernière partie de l'url sera modifié.

103voto

Matt Points 2085
 location.replace("#hash_value_here"); 
 

Ce qui précède semble faire ce que vous recherchez.

6voto

guzart Points 2269

Edit (2013-08-02): Il a été une couple d'années maintenant, et les navigateurs ont évolué.

window.location.hash = 'myHash';

facile!

--Vieille Réponse--

Moi aussi, je pense qu'il est impossible (à cette époque). Mais pourquoi avez-vous besoin de changer la valeur de hachage si vous n'allez pas l'utiliser?

Je crois que la principale raison pour laquelle nous utilisons la valeur de hachage comme les programmeurs, est de permettre à l'utilisateur de bookmark notre site, ou pour enregistrer un état dans l'historique du navigateur. Si vous ne voulez pas faire tout cela, alors il suffit d'enregistrer l'état d'une variable, et de travailler à partir de là.

Je pense que la raison pour utiliser une table de hachage est de travailler avec une valeur qui est hors de notre contrôle. Si vous n'en avez pas besoin, alors cela signifie probablement que vous avez tout sous votre contrôle, il suffit donc de stocker l'état dans une variable et de travailler avec elle. (J'aime me répéter)

J'espère que cela vous aide. Peut-être il ya une solution facile pour votre problème.

Mise à JOUR: Comment à ce sujet:

  1. L'installation d'un premier hachage, et assurez-vous qu'il est enregistré dans l'historique du navigateur.
  2. Quand un nouvel onglet est sélectionné, n' window.history.back(1), qui fera de l'histoire de l'aller retour à partir de votre première initialisation de hachage.
  3. Maintenant, vous définissez la nouvelle table de hachage, par conséquent, la tabulation fera seulement une inscription dans l'histoire.

Vous aurez probablement à utiliser des drapeaux, pour savoir si le courant d'entrée peut être "supprimé" par le retour, ou si vous venez de sauter la première étape. Et assurez-vous que votre méthode de chargement pour le "hash" ne pas exécuter, lorsque vous forcez l' history.back.

-2voto

Ayman Farhat Points 591

Vous pouvez toujours créer un écouteur d'événements pour intercepter les événements de clic sur le lien hypertexte et dans la fonction de rappel, insérez e.preventDefault (), ce qui devrait empêcher le navigateur de l'insérer dans l'historique.

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