2010-09-09 75 views
3

我目前正試圖加載一些js文件異步,以便他們無法阻止網站的其餘部分。 我主要是跟着在這裏找到的描述:與onload事件異步JavaScript加載緩存問題

Asynchronous Javascript

在javascript文件這一偉大工程的非阻塞加載的條件,但我現在得到了問題的JavaScript文件緩存,並保持即使緩存我改變內容(也做shift-reload沒有任何幫助)。

我現在加載腳本的代碼如下所示:

(function() { 
    function xx_async_load() { 
    var xx = document.createElement('script'); 
    xx.type = 'text/javascript'; 
    xx.async = true; 
    xx.src = 'http://myserver.de/myjs.js'; 
    var el = document.getElementsByTagName('script')[0]; 
    el.parentNode.insertBefore(xx, el); 
    } 

    if (window.addEventListener) { 
    window.addEventListener('load', xx_async_load, false); 
    } else if (window.attachEvent){ 
    window.attachEvent('onload', xx_async_load); 
    } 

})(); 

如果我直接調用內部「xx_async_load」的代碼,改變myjs.js,變化越來越認可,但如果我通過onload事件加載它,它始終保持緩存,並且更改不會被識別。

有沒有人知道我如何讓瀏覽器識別緩存文件中的變化(問題出現在Opera,FF和IE工作正常)?

編輯:如果我看歌劇蜻蜓的「網絡」選項卡,甚至沒有重新加載的緩存JS文件做了要求,它似乎是直接從緩存中加載它,甚至沒有檢查針對服務器上的文件。

EDIT2:我將測試它停留在緩存多久。如果它一直到明天都很好。否則,我仍然可以使用日期參數來提出解決方法(因此接受該答案)。 Thx再次。

回答

3

是的,這很簡單。

只要給一個隨機參數進行您的網址,如:URL = http://www.yoururl.com - >http://www.yoururl.com/?number=(random號)

這樣你將永遠有一個唯一的URL。該參數在加載時會被頁面扔掉,因爲它沒有被使用。

讓我知道,如果這有助於

+1

ie:'xx.src ='http://myserver.de/myjs.js?' + new Date()。getTime();' – Mic 2010-09-09 08:38:09

+0

正如Mic所說,使用日期是一個很好的ID,我主​​要使用Guids – Nealv 2010-09-09 08:44:05

+1

謝謝,這將工作。但是,它永遠不會被緩存,並且該腳本稍後將在網頁瀏覽量巨大的網站上使用。因此,根本不緩存對我來說不是真正的解決方案。也許我每天都會與「日期」一起去。我仍然會讓它不被接受,也許有人提出了另一種解決方案,但謝謝。編輯:哈哈花了很長時間與我的評論;) – enricog 2010-09-09 08:44:55

1

解決這個問題的一個好方法是計算的文件內容的MD5(),然後將該值添加到URL作爲參數。這樣,只要文件內容相同,文件就會一直保持緩存。

另一種方法是使用HTTP標頭(如ETag)控制腳本的緩存行爲或降低最大緩存到期時間。

+0

嗨,我的第一個解決方案是不可能的,因爲客戶必須在他們的網站上集成腳本(這只是他們的模板),因此如果js會改變客戶,還必須更改md5。 ETags也由服務器設置。奇怪的是,如果我看看Operas Dragonfly的「網絡」選項卡,甚至沒有爲緩存的JS文件做出請求,它似乎直接從緩存加載,甚至沒有檢查服務器。 – enricog 2010-09-09 12:59:41

+0

@ TheCandyMan666也許這是因爲你之前設置了一些緩存設置,告訴瀏覽器從緩存加載而不是去服務器?這就是緩存的目的。 – 2010-09-13 10:46:43

+0

也許它有一些默認設置。我的意思是,第二天它重新加載腳本,所以最後它不是什麼大問題。但我認爲它應該始終檢查服務器並等待(304?)未修改的響應。如果我沒有上傳它,它確實檢查並識別這些更改。 – enricog 2010-09-13 11:47:59

0

在Apache指令高速緩存控制閱讀起來....

你可能想在你的apache.conf文件或.htaccess文件是這樣的

的例子告訴瀏覽器緩存JS文件,直到7天后才能檢查新版本

<Directory "C:/apache_htdocs"> 
    # 
    # Enable caching for static files 
    # A86400 = Access + 01 days 
    # A604800 = Access + 07 days 

    <FilesMatch "\.(js)$"> 
     ExpiresActive On 
     ExpiresDefault       A604800 
     ExpiresByType application/x-javascript A604800 
     ExpiresByType application/javascript  A604800 
     ExpiresByType text/javascript    A604800 

     Header set Cache-Control "public, max-age=604800, pre-check=604800" 
    </FilesMatch> 
</Directory>