ユースケースから特定の HTML または JavaScript がなければ、最適なアプローチを絞り込むのは困難です。とはいえ、履歴の状態とハッシュを処理する場合、ツールキットには実際には 3 つの重要なツールがあります。
変更の防止
次のように、タブのハンドラー コードでevent.preventDefault();
( docs )を使用して、問題全体を回避することもできます。
$('.tab').on('click', function (e) {
e.preventDefault();
...
});
ユーザーがタブをクリックすると、すぐに呼び出さpreventDefault
れます。これにより、デフォルトのアクションが続行されなくなります。この場合、ドキュメントの URL を変更する (おそらく) リンクの既定の動作を妨げています。は...
、タブ クリック アクションを処理するための既存のコードを示します。
結局のところ(ユースケースを確認せずに)、これはおそらく「最良の」アプローチです。少なくとも、それはより簡単です。
変化の検出
オブジェクトのonhashchange
イベント( docs、ブラウザーのサポートが制限されていることに注意してください) を使用して、ハッシュの変更を検出できます。window
オブジェクトのonpopstate
イベントは同様の方法 ( docswindow
)で使用できますが、これは微妙に異なり、「タブ」の実装方法や、履歴に対する他の変更を監視する必要があるかどうかによっては、より適切な場合があります。州。
$(window).on('hashchange', function (e) {
console.log('hash change', e);
});
$(window).on('popstate', function (e) {
console.log('popstate', e);
});
ここで両方の動作を確認してください: http://jsfiddle.net/m7qV9/1/ (必ずコンソールを開いてください)
これらのアプローチのいずれかで、history
オブジェクト ( docs ) を使用して、必要に応じて履歴の置換または追加を管理します。
1 つのアプローチ: 交換
を使用した小さなサンプルを次に示しhistory.replaceState
ます。このアプローチにより、アクティブなタブの識別子を URL に保持できるため、ユーザーは履歴を通じて元の場所に戻ることができますが、タブが変更されるたびに履歴レコードが乱雑になることはありません。http://www.mySite.com/#tab2
たとえば、ページがロードされたときにタブ #2 が開きますが、ユーザーがタブ 1 に切り替えて別のページに移動してから戻ってきた場合、タブ #1 がアクティブになります。
これは概念のモックアップであることを覚えておいてください。既存の HTML と JavaScript がどのように見えるかはわかりません。そのため、特定の実装に対する直接的なソリューションを作成するのではなく、アプローチを示すだけです。
$('.tab').on('click', function (e) {
e.preventDefault();
var whichtab = $(this).attr('href');
$(this).parent().find('.active').removeClass('active');
updateTab(whichtab, $(this).parent());
return false;
});
$(document).ready(function() {
if (document.location.hash.length > 0)
updateTab(document.location.hash);
});
var updateTab = function (tab, parent) {
if (!parent)
parent = document;
if (parent.find('.tab[href='+tab+']').length < 1)
return;
parent.find('.tab[href='+tab+']').addClass('active');
parent.find('.tabContent-'+tab.replace('#', '')).addClass('active');
window.history.replaceState({}, '', tab);
return true;
};
ここで試してみてください: http://jsfiddle.net/5Qegc/
どの JavaScript と HTML を使用しているかをよく理解していなければ、正確に判断することは困難です。お役に立てれば。
ドキュメンテーション