57 votes

Modifier le hachage sans déclencher un événement de hachage

Je suis l'aide de la table de hachage pour charger du contenu dynamiquement. Pour rendre le bouton de retour du travail, je suis capturer les modifications de hachage. Cependant, parfois, j'ai besoin de changer la valeur de hachage sans déclencher le hachage changé de fonction (par exemple, lorsque la page a été redirigé côté serveur et j'ai besoin de mettre à jour la table de hachage une fois que le contenu est de retour.)

La meilleure solution est de séparer la hashchange événement, faire le changement, puis reconnectez -. Toutefois, comme cela se passe de manière asynchrone, je trouve qu'il relie, trop vite, et encore attrape le hachage de changement.

Ma solution pour le moment est très faible: une nouvelle liaison dans un setTimeout. Quelqu'un aurait-il une meilleure idée?

    $(window).unbind( 'hashchange', hashChanged);
    window.location.hash  = "!" + url;
    setTimeout(function(){
        $(window).bind( 'hashchange', hashChanged);
    }, 100);


Edit:
Amir Raminfar de la suggestion qui m'a incité à une solution qui ne nécessite pas de délai d'attente. J'ai ajouté une variable de classe

_ignoreHashChange = false;

Lorsque je veux changer la valeur de hachage en silence je fais ceci:

_ignoreHashChange = true;
window.location.hash  = "!" + url;

et le hachage événement a changé fait ceci :

function hashChanged(event){
    if(_ignoreHashChange === false){
        url = window.location.hash.slice(2);
        fetchContent(url);
    }
    _ignoreHashChange = false;
}

6voto

Amir Raminfar Points 17939

Vous pouvez avoir une fonction comme celle-ci:

 function updateHash(newHash){
  ...
  oldHash = newHash
}
 

puis dans votre setTimeOut vous devez faire

 function(){
  if(oldHash != currenHash){
    updateHash(currenHash);
  }
}
 

Alors maintenant, vous pouvez appeler manuellement le hash de la mise à jour et celui-ci ne sera pas déclenché par l'événement. Vous pouvez également avoir plus de paramètres dans updateHash pour faire d'autres choses.

Au fait, avez-vous regardé le plugin JQery History? http://tkyk.github.com/jquery-history-plugin/

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