2012-09-27 72 views
1

我使用這個代碼,以動態加載外部網頁減少HTTP

$(function() { 
    $('#nav a').click(function() { 
    var page = $(this).attr('href'); 
    $('#content').load(page + '.php'); 
    return false; 
    }); 
}); 

我注意到,每一次我在菜單選項卡中點擊一次,一個新的HTTP請求發送請求和頁面再次裝載。我想知道如何讓每個頁面加載一次,所以當我瀏覽標籤時,已經加載的頁面不顯示新的請求而顯示?

+0

第一負載後,頁面應該被高速緩存使得HTTP請求/響應一個微不足道的未修改響應。這不是這種情況嗎? – thatidiotguy

+1

這可能並非如此,因爲他的頁面可能不報告自己緩存,因爲他們是動態生成的。您可以通過調整PHP代碼來輸出適當的聽者來控制緩存能力。 –

+0

我認爲jQuery爲Ajax請求添加了一個反緩存GET參數。 –

回答

3

您可以使用.data()「標記」已加載標記的選項卡,並且只在標記不存在時發出HTTP請求。

編輯:關於氪石的評論,這將是一個簡單的解決問題的方法:

var pages = {}; 

$(function() { 
    $('#nav a').click(function() { 
    var page = $(this).attr('href'); 

    if (!(page in pages)) { 
     $.get(page, function (data) { 
     pages[page] = data; 
     }); 
    } 

    $('#content').html(pages[page]); 

    return false; 
    }); 
}); 
+0

看起來他有一個顯示窗格,每次單擊一個新選項卡時都會重新創建。我可能是錯的,但是他不必爲每個頁面存儲頁面內容? – Kev

+0

是的,這樣他就可以適應這種方法的內容存儲在一個對象和加載的內容,當對象不具有這樣的關鍵。 – CQQL

+0

我想是這樣,但是這實際上是寫他自己的緩存引擎。必須有一個標準的方法來做到這一點。 – Kev

0
$('#nav a').click(function(e) { 
    e.preventDefault(); 
    $this = $(this); 
    if ($this.data('loaded') !== true) { 
     // Load it. 
     $this.data('loaded', true); 
    } else { 
     alert('Already loaded that one!'); 
    } 
}); 

這會做你的需要。你需要把你的加載代碼在我有// Load it.評論,可能要刪除的else塊爲好。 http://jsfiddle.net/rRumK/