5

プログラムでURLハッシュ(#)を設定するときにフィードバックループを防ぐために(URLを手動で変更するのとは対照的に)、hashChangeリスナーを一時的に無効にします。

$ .bbq.pushState(hash)を使用してハッシュを更新するときに、実際にハッシュ変更イベントを無効にするには、このコードをどのように変更すればよいですか?(以下のコードは機能しません)

hashChangeEnabled : true,

bindHashChange : function(){
        var that = this;

        $(window).bind( 'hashchange', function( event ) {
            if(that.hashChangeEnabled == true){
                stateObj = event.getState() 
                that.stateChangedHandler(stateObj);
            }
        });

    },



updateURL : function(hash){
        this.hashChangeEnabled = false; // <--- Look here 
        $.bbq.pushState(hash);
        this.hashChangeEnabled = true;
    }, 
4

1 に答える 1

1

イベント ハンドラーのコードが実行されると、hashchange イベントは非同期に発生し、hashChangeEnabled は既に true にリセットされます。hashchange イベントで hashChangeEnabled をリセットする必要があります。

if(that.hashChangeEnabled == true){
  stateObj = event.getState() 
  that.stateChangedHandler(stateObj);
}
else {
  that.hashChangeEnabled = true;
}

updateURL 関数で、ハッシュが変更されたかどうかを確認できます。

if (hash !== $.param.fragment()) {
  this.hashChangeEnabled = false;
  $.bbq.pushState(hash);
}

または、setTimeout を使用して hashChangeEnabled をリセットします (ハッシュが変更された場合は、hashchange イベントが発生するのを待ちます)。

this.hashChangeEnabled = false;
$.bbq.pushState(hash);
setTimeout(function() { this.hashChangeEnabled = true; }, 500);
于 2011-06-09T10:07:45.567 に答える