2011-07-15 7 views
2

たとえば、jQueryでは、リージョンに何かをロードするためのリンクを設定すると、history.pushStateを呼び出す前にコンテンツをロードする必要がありますか?AJAXのloadとhistory.pushStateの推奨される順序は何ですか?

また、history.pushStateを呼び出した後にコンテンツを読み込む必要がありますか?

$('#link').click(function() { 
    history.pushState(null, null, 'newUrl'); 
    $('#region').load('regionContent'); 
    return false; 
}); 

かつて私はコンテンツがないまでURLは変更されないと感じ、私はより頻繁に、後者を見てきました(例えばhttps://github.com/blog/760-the-tree-slider)ので、私は考えられているので思ったんだけど、私には望ましいと思われますベストプラクティス。

答えて

4

両方の例では、ユーザーが戻るボタンを押すと、コンテンツは変更されません。あなたはあなたの状態変更ハンドラの中に何も持っていないので。

基本的にこれを実行したいと思う:

$('#link').click(function() { 
    History.pushState(null,null,'newUrl'); 
}); 
$('body').bind('statechange',function(){ 
    $('#content').load(History.getState().url); 
}); 

これは、このリンクをクリックすると、ページの状態が変更されますそれを作る、そしてあなたのページの状態を考えると、それを変更したことだろう新しいコンテンツに読み込まれます。ブラウザの戻るボタンを押すと、状態が変わり、新しいコンテンツが読み込まれます。

は、今ここで私は、異なる時刻での状態変更イベントを発生させますHistory.jsstatechange、代わりにネイティブpopstateState.urlなど、さまざまなブラウザのHistory.getState().urlを使用していました。例えば、サファリは、ページロード時の状態変更イベントで、chromeとfirefoxはそうではありません。あなたのコンテンツがsafariに2回ロードされる原因になります。 History.jsは、すべてのブラウザで一貫性のあるAPIを提供しています。また、HTML4ブラウザでさえもハッシュに頼ることを望むなら、History.jsは一貫したAPIを提供します。

+0

この実装が正しく理解されていれば、コンテンツが読み込まれる前に履歴をプッシュする必要があることを意味します。実装の統一性(すなわち、コンテンツが単一のイベントに応答してのみロードされる)以外は、これが望ましい理由は何か? –

+0

また、コンテンツをロードする前に履歴をプッシュすることは、プッシュするURLをサーバー上で決定する必要がある(たとえば、POST-REDIRECT-GETによる検証 - 検証が成功した場合は新しいURLをプッシュし、失敗した場合は、URLをプッシュしないでください)。 –

+0

私は最初に状態を更新すると感じる傾向があります。次にコンテンツを読み込むことは、これがWebが過去20年間働いて仕事をしてきた方法であるためです。あなたは新しいページに移動し、状態が変化し、新しいコンテンツを読み込みます。コンテンツがエラーページである可能性があります。たとえば、状態を存在しないページに変更すると、現在の作業状態にエラーを表示するのではなく、コンテンツが存在しない状態の404になることが期待されます。 – balupton

関連する問題