2012-01-23 15 views
4

でwindow.onpopstateイベントを発生しないで、私は以下のようなものを作成:完全なコードはここにあるHTML5履歴APIは - HTML5歴史APIを使用すると、最初のページのロード

(function (d, w) { 

    $(function() { 

     $("#indicator").hide(); 

     if (typeof history.pushState !== 'undefined') { 

      $("#citylinks a").click(function (e) { 
       history.pushState({ path: this.href }, '', this.href); 
       act(this.href); 
       e.preventDefault(); 
      }); 

      w.onpopstate = function (event) { 
       act(d.location); 
      }; 
     } 

     function act(location) { 

      $("#results").hide(); 
      $("#indicator").show(); 

      $.getJSON(location, function (data) { 

       $("#results").html(data.result); 
       $("#results").fadeIn(); 

       $("#indicator").hide(); 
      }); 
     } 

    }); 

})(document, window); 

を:

https://github.com/tugberkugurlu/MvcMiracleWorker/commit/7c511f20678bbfe15462909c794eb323ce615372#diff-3

私がここに持っている問題は、サーバーから初めてページが来るときにw.onpopstateイベントを発生させたくないということです。

私がこれをやりたい理由は、サーバー側でページを埋めたいので、クライアント側のコードでそのようにしたくないからです。 w.onpopstateイベントを削除すると、history.go()イベントを捕まえることができなくなります。

この問題を解決する方法はありますか?

答えて

4

A非常に単純なアプローチは、このようになります:

w.onpopstate = function() { 
    w.onpopstate = function (event) { 
     act(d.location); 
    } 
} 

これは最初の時間はonpopstateイベントが発生するが、あなたの関数を効果的NOOPを作成し、(現在のハンドラを置き換え)イベントハンドラに設定されていることを意味しますは、イベントがページの読み込み時に実行されるときに使用します。

+0

良い解決策。ひとつは、 'windows.onpopstate'イベントごとに実行されることです。私は( 'null'または' undefined'の場合は 'window.onpopstate'イベントを調べることによって)それを防ぐことを試みましたが、動作させることができませんでした。 – tugberk

+0

これはちょっとしたhack-y解決策です。代わりに、このような何かを試すことができますhttp://stackoverflow.com/a/11453389/191551。 –

+0

@ライアン:たぶんそれはハッキーですが、私はそれを実際に見ません。何かあれば、リンクした例の追加チェックを必要としないので、より効率的です。もちろん、私たちはマイクロ秒で話していますが、それは重要ではありませんが、フリップ側ではこのテクニックを使用することで何か間違いはありません。残念ながら、残念ながら、現時点ではこの時点で思い出すことができませんでした:-p –

関連する問題