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);
}

基本的に、リンクをクリックするとすぐにハッシュが更新され、close 関数が呼び出されます。close 関数は、ハッシュが変更されるまでバインドしないでください。リスナーが追加されるとすぐに関数が呼び出されるのはなぜですか?closeまた、それを防ぐにはどうすればよいですか? 最新バージョンの Chrome でテストしています。

4

1 に答える 1

3

Javascriptが同期しているためだと思いますので、を設定するwindow.location.hashと、現在実行中の関数が終了window.onhashchangeするまでメソッドは実行されません。onclickそれは理にかなっていますか?したがって、.hash値を設定してから、hashchangeイベントをバインドします...バインドの直後に、onhashchangeイベントが実際に発生します。そのため、順番にを呼び出しますcloseconsole.logコード全体にステートメントを配置して、実行の順序を確認してください。

更新

これが物事の順序を示すためのフィドルです:http://jsfiddle.net/jmWDY/

onhashchange元の関数が最初に呼び出され(関数が終了した後)、次に新しいバインディング(つまり)が呼び出されることに注意してくださいclose。これがお役に立てば幸いです。

于 2012-11-02T18:28:45.450 に答える