無特定的HTML或JavaScript的使用情況,很難縮小最佳方法。也就是說,在處理歷史狀態和散列時,工具包中確實有三個重要的工具。
防止
您也可以通過在你的標籤處理程序代碼中使用event.preventDefault();
(docs),像這樣避免了整個問題的變化:
$('.tab').on('click', function (e) {
e.preventDefault();
...
});
當用戶點擊標籤,您立即致電preventDefault
- 這將停止默認操作繼續。在這種情況下,您正在阻止鏈接的默認行爲(假定)更改文檔的URL。 ...
表示用於處理選項卡單擊操作的現有代碼。這可能是「最好」的方法;而且,至少,它更容易。
檢測到改變
您可以使用onhashchange
事件window
對象(docs,注意有限的瀏覽器支持)來檢測對哈希。
的window
對象的onpopstate
事件可以以類似的方式(docs)一起使用,但是這是一個微妙的不同,並可能取決於你如何貫徹「標籤」更合適,以及是否需要監視歷史狀態的其他更改。
$(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)來管理替換或增加歷史,取決於需要。
一種方法:更換
下面是使用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,這是很難做到準確。希望這可以幫助。
文檔
你在做當你點擊選項卡上的服務器請求? –