2010-07-11 6 views
3

Donc, je voudrais que ma page charge du contenu si le hachage d'une fenêtre a changé.onHashChange running onLoad ... awkward

En utilisant Mootools, cela est assez facile:

$extend(Element.NativeEvents, { 
    hashchange: 1 
}); 

puis:

window.addEvent('hashchange', function() {}); 

Cependant, l'événement hashchange tire lorsque la page est chargée, même si les spécifications l'exigent pas tirer jusqu'à ce que le chargement de la page soit terminé!

Sauf si je charge la page pour la première fois, sans hachage, tout fonctionne comme prévu.

Je pense que le problème ici est le fait que le navigateur considère le chargement de la page "complète", puis exécute le reste du JavaScript, qui inclut la détection de hachage pour charger la page requise.

Par exemple, si je tapais http://foo.bar/, tout irait bien. Cependant, idéalement, http://foo.bar/#test chargerait la page initiale, détecterait le hachage et chargerait le contenu "test".

Malheureusement, le navigateur charge la page initiale, la considère comme "domready", et charge ensuite le contenu "test", qui déclenche alors onHashChange. Oops?

Cela provoque une boucle infinie, sauf si je demande spécifiquement au navigateur de ne PAS mettre à jour le hachage si un événement onHashChange est en cours de déclenchement. C'est simple:

var noHashChange; 
noHashChange = true; 
var hashes = window.location.hash.substr(1).split("/"); // Deciphers the hash, in this case, hashes[0] is "test" 
selectContent(hashes[0]); // Here, selectContent would read noHashChange, and wouldn't update the hash 
noHashChange = false; 

Maintenant, mettre à jour le hash APRÈS le chargement de la page fonctionnera correctement. Sauf que cela devient encore fou sur un chargement de page initial et récupère le contenu environ 3 ou 4 fois, car il continue de détecter le hachage a changé. Désordonné.

Je pense qu'il peut avoir quelque chose à voir avec la façon dont je suis en train de le hachage, mais je ne peux pas penser à une meilleure façon de le faire, sauf:

window.location.hash = foobar; 

... à l'intérieur d'une fonction est exécuté chaque fois qu'un nouveau contenu est sélectionné.

Voilà le problème, oui? La page est chargée, le contenu est chargé (si le contenu) ...

J'espère que je suis cohérent ...

+0

Pouvez-vous créer un jsfiddle avec un exemple de travail? www.jsfiddle.com –

+0

@chase: www.jsfiddle. * net * - juste au cas où;) – polarblau

+0

Woops! J'aurais du être mieux informé. –

Répondre

0

Peut-être que vous pouvez vérifier le hachage d'abord à éliminer la récursion:

Pourquoi le gestionnaire onHashChange modifie-t-il le hachage de toute façon?
if(window.location.hash != foobar){ window.location.hash = foobar;} 

Pourquoi le gestionnaire onHashChange modifie-t-il le hachage? S'il y a une sélection par défaut avant de charger le contenu, alors peut-être que cela pourrait aller dans une fonction séparée.

(Je dis cela parce qu'il semble que vous ayez une sorte de structure de répertoire-esque convention à votre emplacement.hash'es, peut-être que vous sélectionnez une feuille spécifique d'un arbre lorsque la racine est sélectionnée ou quelque chose?

+1

En fait, je n'ai pas été très cohérent, puisque, relisant ma question, je n'ai aucune idée de ce que j'essayais de dire. Bravo sur la réponse, c'est en effet une structure de répertoire. Je vais vérifier votre solution. –

+0

Pouvez-vous poster la bonne solution ou choisir une réponse comme étant la bonne pour cette question? –

+0

Salut Tim - nous avons décidé de ne pas encore implémenter onHashChange ". Mais rassurez-vous, cela me vient à l'esprit, et une fois que nous y arriverons, je vous dirai comment nous l'avons fait. Entre maintenant et maintenant, nous avons peut-être découvert une fonction mootools qui gère correctement cela, donc cela peut être discutable. –

0

Vous pouvez implémenter un observateur pour l'objet de hachage qui déclenchera une fonction lorsque l'objet has a changé. Cela n'a rien à voir avec le chargement réel de la page. la meilleure façon de le faire est par Object.prototype.watch
voir d'autres pages sur le même sujet: On - window.location.hash - Change?

0

un coup d'oeil à MooTools History il implémente le onhashchange si la nouvelle api de l'histoire de html5 n'est pas disponible, pas besoin de réinventer la roue :)