我不熟悉或意識到Bootstrap的TabBack系統有任何延遲,您可能想要驗證問題不是由於您的特定用途或計算機造成的。我無法在任何我熟悉的瀏覽器上使用jQuery hashchange插件產生任何延遲。至於其他處理基於散列的導航的方式,我寫了以下內容以使用jQuery hashchange插件更改hashchange事件上的內容/頁面;主要是乾淨地支持後退/前進/鏈接與哈希。我遵循的是我使用的修剪版本。
該示例提供了一個錨鏈接以及onclick事件生成的鏈接。首選使用onclick事件是因爲如果用戶單擊當前活動的選項卡,該頁面仍會重新加載。跟蹤頁面加載時間以確保頁面在100毫秒內不會被加載兩次。
的jQuery插件哈希:http://benalman.com/projects/jquery-hashchange-plugin/
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="http://benalman.com/code/projects/jquery-hashchange/jquery.ba-hashchange.js"></script>
<script>
var hashUris = [];
var tabSet;
var actPage = '';
// bare tab array (use to populate tab html and hash array)
tabSet = [{hash: 'page1', pageId:1, id: 1}, {hash: 'page10', pageId:10, id:2 }, {hash: 'page20' , pageId: 20, id: 3}];
// handles the hash events
$(function() {
// loop all tab array, add items to hash array, determine primary page and active page
$.each(tabSet, function(i, tab) {
// using tabIndex to prevent looping hash array later
tab.tabIndex = i;
// first tab is primary by default
if (typeof priTabId == 'undefined') priTabId = tab.id;
// add tabs/page info to hash array
hashUris.push({hash: tab.hash, pageId: tab.pageId, tabIndex: i, tabId: tab.id, priActive: priTabId == tab.id});
// initial page to be loaded
if (priTabId == tab.id) priTabIndex = i;
// current hash
if (location.hash && '#'+tab.hash == location.hash) activeTabIndex = i;
});
if (!location.hash && !actPage && typeof priTabIndex != 'undefined') {
// page load, load primary tab
loadTabPage(priTabIndex);
} else if (location.hash && !actPage && typeof activeTabIndex != 'undefined') {
// page refresh
loadTabPage(activeTabIndex);
}
$(window).hashchange(function(){
if (location.hash) {
$.each(hashUris, function(index, hashUri) {
if ('#'+hashUri.hash == location.hash && actPage != hashUri.pageId + '#' + hashUri.hash) {
// found matching tab/page
loadTabPage(hashUri.tabIndex);
}
});
} else if (actPage) {
// navigated to empty space, attempt to find a primary active page
$.each(hashUris, function(index, hashUri) {
if (hashUri.priActive) loadTabPage(hashUri.tabIndex);
});
}
});
});
function loadTabPage(tabIndex) {
if (typeof tabSet[tabIndex] == 'undefined') return;
// track when the page was loaded
lastLoad = tabSet[tabIndex].lastLoad;
tabSet[tabIndex].lastLoad = new Date().getTime();
// load only once in 1ms-100ms
if (tabSet[tabIndex].lastLoad - lastLoad < 100) return;
// load page content/do actions here
alert(tabSet[tabIndex].pageId);
//$("#content").load('?pageId='+tabSet[tabIndex].pageId);
// active page checked against hash during hashchange
actPage = tabSet[tabIndex].pageId + '#' + tabSet[tabIndex].hash;
};
// user code to create tabs
$(function() {
// use tabs array to display some tabs
// this depends on the above code to set .tabIndex on the tabSet array
tabsObj = $('<div/>');
$.each(tabSet, function(i, tab) {
if (!tab.hash) return true;
tmpObj = $('<span>'+tab.hash+'</span>');
tmpObj.data('tabIndex', tab.tabIndex);
// use an onclick event to change the page
tmpObj.bind('click', function(e) {
if (typeof $(this).data('tabIndex') == 'undefined' || typeof tabSet[$(this).data('tabIndex')] == 'undefined') return;
// load page directly if active hash, otherwise change to clicked hash
if ('#'+tabSet[$(this).data('tabIndex')].hash == location.hash) {
loadTabPage($(this).data('tabIndex'));
} else {
location.hash = tabSet[$(this).data('tabIndex')].hash;
}
e.stopPropagation();
return false;
});
tmpObj.appendTo(tabsObj);
delete tmpObj;
});
tabsObj.appendTo($("#tabs"));
delete tabsObj;
});
</script>
<div id="tabs"><a href="#page1" >Link to Hash</a></div>
<div id="content"></div>
延遲與Bootstrap沒有任何關係。延遲是Internet Explorer認識到URL哈希已更改。只需使用基本的Javascript即可觀察到這種效果。 – Matthew 2012-04-23 12:49:02
你能否提供一個關於如何在Internet Explorer中重現延遲的例子。在Internet Explorer 9(x64)中偵聽hashchange事件時,我無法重現任何延遲/問題。 – mstrthealias 2012-04-23 14:20:21
我或多或少地通過使用cookie解決了這個問題(除了哈希)。 經過進一步調查,我發現問題不是*總是*容易複製。似乎在頁面中使用越來越多的Javascript,IE在更新'window.location.hash'的值方面落後,至少在從window.location.replace'設置時。 – Matthew 2012-04-30 18:34:49