私は実際に非常に似たようなことをしようとしてきました…</p>
これまでのところ、すべてのポイント (1-4) で成功していますが、HTML4 ブラウザーがよりクリーンなリンクを表示する方法に取り組んでいます (history.js を使用すると、醜いhttp://domain.org/が生成されます)。 page/page#-http://domain.org/modalリンクできないページ)。
作業を行うためのヒントを次に示します。
必ず onpopstate イベントにバインドしてください。このようにして、ブラウザの進むボタンと戻るボタンをキャプチャして、何をすべきかを理解できます。
window.onpopstate = function(e) {
var State = e.state;
if (!State) { //i.e., we've gone to the history context (no active state)
$('#modal').modal('hide');
}
else {//Re-open state modal
var modalURL = State.URL.substring(State.URL.indexOf('?show=')+6);
openModal(appRoot+modalURL, State);
}
}
前の状態オブジェクトにアクセスできないため (または少なくとも方法が見つからないため)、onpopstate 関数は完全ではありません。そのため、変数を URL に追加することをお勧めします。私の例では、URL に '?show=relativeModalLink/' が追加されているので、モーダルが開かれたページがわかります。このように、サーバー側のコードを使用して show URL 変数が渡されたかどうかを検出し、ユーザーをモーダル ページに誘導するか、メイン ページに戻してモーダルを開く (好みの問題) こともできます。
状態が null かどうかを確認する理由は、ページをロードすると、ブラウザーが実際に状態を持ち、それが null になるためです。したがって、 null はモーダルの不在と見なすことができます。
モーダルを開くときは、次のようにします。
function openModal(modalLink, state) {
if (state === undefined) {
var shortLink = modalLink.substring(modalLink.indexOf(appRoot)+appRoot.length);
var stateLink = document.location.href.indexOf('?show=') === -1 ? document.location.href+'?show='+shortLink : document.location.href;
history.pushState({'type': 'modal','URL':stateLink},'',stateLink);
}
}
ユーザーが進むボタンを使用して既存のモーダル状態に移動した場合に別の状態をプッシュしたくないため、状態を open モーダル関数に渡したことに注意してください。
これは私の実装に少し固有のものであるため、リンク システムは少し異なる場合があります。
また、もう 1 つ注意点があります。window.history.back() 関数をブートストラップの閉じるボタンに直接バインドしてください (ブートストラップの「非表示」モーダル関数内に配置しないでください)。このように、ユーザーが戻るボタンを押しても、コード内でページが 2 回戻ることはありません (onpopstate 関数で .modal('hide') を呼び出すため)。戻るボタンが押されたかどうか、またはブートストラップの「非表示」機能内から閉じるボタンでモーダルが閉じられたかどうかを検出する方法をまだ見つけていません (実際、それが可能だとは思いません…)。
history.js を実装するには、ページにスクリプトを含めるだけです。HTML5 ブラウザーでは無視され、HTML4 ブラウザーでは上記のコードで問題なく動作するようです (前述の見苦しい URL の問題を除いて)。history.js ドキュメントの実装手順は異なりますが、ページの「ajax化」はモーダルの状況とは少し異なります。
お役に立てれば!