2012-11-02 3 views
2
overlay.onclick = function(e){ 
    e.preventDefault(); 
    window.location.hash = 'overlay'; 

    var close = function(){ 
     //do some stuff 
     window.removeEventListener('hashchange', close); 
    } 

    window.addEventListener('hashchange', close, false); 
} 

Fondamentalement, dès que je clique sur le lien, le hachage est mis à jour, et la fonction de fermeture appelle. La fonction de fermeture ne doit pas être liée avant que le hachage ne soit modifié. Pourquoi la fonction close est appelée dès que l'écouteur est ajouté et comment puis-je l'empêcher. Test dans Chrome, dernière version.fenêtre hashchange appelant appelant après avoir été ajouté

Répondre

3

Je pense que c'est parce que Javascript est synchrone, donc quand vous définissez window.location.hash, la méthode window.onhashchange ne fonctionnera pas jusqu'à ce que la fonction onclick en cours d'exécution se termine. Cela a-t-il du sens? Donc, vous définissez la valeur .hash, puis liez un événement hashchange ... juste après la liaison, l'événement onhashchange se déclenche réellement. Donc, à son tour appelle close. Essayez de mettre des instructions console.log dans votre code pour voir l'ordre d'exécution.

MISE À JOUR:

est ici un violon pour démontrer l'ordre des choses: http://jsfiddle.net/jmWDY/

Remarquez comment la fonction onhashchange originale est appelée en premier (après votre fonction est terminée), votre nouvelle liaison (qui est close). J'espère que cela a aidé!