8

jQuery BBQ プラグインを使用して、状態を location.hash にプッシュしています。

フィードバック ループを防ぐために、プログラムで状態を設定している間、hashchange リスナーを一時的に無効にしたいと考えています。

私はこの解決策を見てきました: hashchange イベントをトリガーせずにハッシュを変更する

残念ながら、これを行っても時々トリガーされるため、完全に堅牢ではないようです。

updateURL(obj){
  $(window).unbind( 'hashchange');
  $.bbq.pushState(obj);
  setTimeout( function() { bindHashChange()}, 500);
}

プログラムで状態をプッシュするためのより良いアプローチはありますか? おそらく別のJSライブラリですか?

4

1 に答える 1

2

タイムアウトでこれを行うと、確実に機能しません。リンクされた回答の重要な部分は、ハンドラーが知っているフラグを設定することです。コードの更新された質問を参照してください。

または、一時ハンドラーを、ハンドラーの再確立を担当するイベントにバインドします。

function updateState(state, handler) {
    var win = $(window);

    function temporaryHandler() {
        win.unbind('hashchange', temporaryHandler);
        win.bind('hashchange', handler);
    };

    win.unbind('hashchange', handler);
    win.bind('hashchange', temporaryHandler);

    $.bbq.pushState(state);
}
于 2011-08-14T17:21:38.163 に答える