J'ai bien peur que cela soit impossible, mais y a-t-il un moyen de modifier la valeur de hachage d'une URL sans laisser une entrée dans l'historique du navigateur et sans recharger ? Ou faire l'équivalent?
En ce qui concerne les détails, je développais une navigation de hachage de base comme:
//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);
}
En utilisant jQuery, évidemment. L'idée est que dans ce cas précis 1) faire revenir l'utilisateur sur chaque changement d'onglet pourrait effectivement `` casser le bouton de retour '' en empilant des références inutiles, et 2) ne pas conserver l'onglet sur lequel il se trouve actuellement s'il appuie sur Actualiser est un ennui.
Réponses:
location.replace("#hash_value_here");
a bien fonctionné pour moi jusqu'à ce que je trouve que cela ne fonctionne pas sur IOS Chrome. Dans ce cas, utilisez:N'oubliez pas de conserver la
#
ou la dernière partie de l'url sera modifiée.la source
window.location.hash = 'my-hash';
suivi dehistory.replaceState(undefined, undefined, "#my-hash")
?history.replaceState
diffère-location.replace
t-il de ?Ce qui précède semble faire ce que vous recherchez.
la source
window.location.replace(('' + window.location).split('#')[0] + '#' + hash);
pour simplement mettre à jour le hachage<base href ="http://example.com/" />
s'il contient une balise de base , alors lorsque vous utilisez la méthode replace avec juste un début,"#hash_value_here"
ce sera comme si vous aviez dit `location.replace (' example.com/#hash_value_here' ). Cela semble évident lorsque vous le lisez ici, mais c'est un piège lorsque vous êtes sur une page avec un fragment de chemin et que vous ne réalisez pas que la base est définie.Edit: Cela fait maintenant quelques années, et les navigateurs ont évolué.
La réponse de @ Luxiyalu est la voie à suivre
- Ancienne réponse -
Je pense aussi que c'est impossible (pour le moment). Mais pourquoi avez-vous besoin de changer la valeur de hachage si vous n'allez pas l'utiliser?
Je pense que la principale raison pour laquelle nous utilisons la valeur de hachage en tant que programmeurs est de laisser l'utilisateur mettre nos pages en favori ou d'enregistrer un état dans l'historique du navigateur. Si vous ne voulez rien faire de cela, enregistrez simplement l'état dans une variable et travaillez à partir de là.
Je pense que la raison d'utiliser un hachage est de travailler avec une valeur qui est hors de notre contrôle. Si vous n'en avez pas besoin, cela signifie probablement que vous avez tout sous votre contrôle, alors stockez simplement l'état dans une variable et travaillez avec. (J'aime me répéter)
J'espère que cela vous aidera. Il existe peut-être une solution plus simple à votre problème.
MISE À JOUR: Que diriez-vous de ceci:
window.history.back(1)
, cela fera revenir l'historique de votre premier hachage init.Vous devrez probablement utiliser quelques indicateurs, pour savoir si l'entrée courante peut être "supprimée" en revenant, ou si vous sautez simplement la première étape. Et pour vous assurer que votre méthode de chargement pour le "hachage" ne s'exécute pas, lorsque vous forcez le
history.back
.la source
?mystate=greatness
), même s'il n'a pas besoin d'être ajax, vous pouvez enregistrer les informations que le javascript lira lors de l'initialisation de la requête.Vous pouvez toujours créer un écouteur d'événements pour capturer les événements de clic sur le lien hypertexte et dans la fonction de rappel mettre e.preventDefault (), ce qui devrait empêcher le navigateur de l'insérer dans l'historique.
la source