2009-02-25 95 views
2

我正在編寫一個JavaScript小部件,該小部件旨在用於其他網站,並從我自己的網站加載其他腳本文件(這基本上意味着由於跨域限制而沒有XHR)。現在我想正常處理故障 - 如果一個腳本無法加載,我想從備用服務器加載腳本。如何中止從JavaScript加載外部HTML資源?

我設法處理服務器故障,其中第一個服務器返回一個錯誤,但我也想處理超時 - 如果第一臺服務器花費太多時間來響應我想中止負載並切換到備用服務器。

我遇到的問題是,我可以設置一個超時來觸發切換到備用服務器的方法,但是備用服務器的腳本不會成功加載,直到瀏覽器本身在原始請求中超時 - 這對我的需求來說太長了。

我希望能夠在加載第一個<腳本標記時中止加載並添加指向備用服務器的第二個<腳本標記。

我已經嘗試將原始腳本的src屬性設置爲null,甚至使用removeNode()從HEAD元素中刪除標記,但沒有任何效果。

這一切都在Firefox上嘗試 - 我還沒有嘗試過IE,但解決方案必須在兩者上都能正常工作。我很樂意聽到任何建議。

回答

2

不幸的是,無法取消標籤請求。從歷史上看,瀏覽器只允許同時向一個主機名發送2個請求,所以應該可以從另一個服務器上載入第二個腳本。

您是否在body.onload之前啓動腳本加載?對於正常的頁面加載,瀏覽器在繼續之前等待每個腳本加載,因爲腳本可以改變文檔。如果腳本未修改文檔,則可以使用defer屬性,以便在腳本加載時瀏覽器繼續呈現文檔。

jQuery有一個類似的功能,一些開放的要求: http://dev.jquery.com/ticket/1863 http://dev.jquery.com/ticket/3442

+0

我想加載第二個腳本來自同一臺服務器(無論如何 - 同一主機名 - 它的負載平衡,所以它可能是一個不同的服務器)。這一切都發生在DOMReady和HEAD元素之後,所以它不會延遲頁面渲染。BTW「推遲」僅在IE上受支持。 – Guss 2009-03-04 00:34:32

0

我想你可能想要構建你的小部件使用XMLHttpRequest,它可以通過window.setTimeout()中止。

+0

可能,但由於上面提到的跨域問題,這是不可行的 – Guss 2009-02-25 20:56:55

+0

哦錯過了 - 在那裏/你已經排除了這一點..好吧,沒關係 – 2009-02-26 06:24:26

0

如果你可以修改真實加載,你可以添加一個回調有腳本。只需在頁面頂部設置一個計時器,並在腳本文件的底部清除它。這樣,如果您的腳本加載不正確,則在定時器耗盡時執行備份請求。

在你的頁面的頂部運行內嵌腳本塊如下:

doneLoading = function() { 
    clearTimeout(timeout); 
} 

timeout = setTimeout(function() { 
      ... change the .src on the old inline script element here ... 
        }, 15000); 

在你的外部JavaScript文件的底部,只需要調用doneLoading()。如果您的初始請求超過15秒,則會向備份服務器發出新請求。我不認爲你可以放棄最初的請求,但是備份請求將按預期執行。