2013-02-17 71 views
2

在ASP.NET主頁面我使用YepNope無條件地異步加載jQuery(來自Google CDN,具有本地回退功能)以及在站點中所有頁面上使用的一些腳本。在MasterPage中,我在關閉主體標記(並在YepNope腳本下面加載所有頁面上使用的標記)之前創建了一個ContentPlaceHolder,該腳本用於單個頁面上使用的腳本。由於jQuery應該在網站的每個頁面上都可用,因此不應該在具有特定腳本的頁面上單獨加載jQuery。YepNope - 等待直到加載依賴關係

我遇到的問題是,我無法在加載jQuery的yepnope腳本中使用回調函數或完整函數,因爲這是在MasterPage上,這些是僅在該頁面上使用或添加的單獨頁面腳本,但我需要能夠延遲單個頁面腳本的執行,直到yepnope(出現在頁面腳本上方)完成加載其中使用的任何依賴項(如jQuery)爲止。

我能想到兩個選項 -

1-使頁面的外部文件,並且使用語法負載所用的腳本 -

yepnope('/url/to/your/script.js'); 

yepnope({ load: '/url/to/your/script.js' }); 

我我不確定我是否喜歡這個想法,因爲它引入了一些額外的HTTP請求,用於幾行javascript,而不會在任何其他頁面上使用。

2-在另一個yepnope測試對象塊中再次加載jQuery,並且完整的函數包裝頁面腳本(在沒有測試的情況下完成調用似乎在加載前面的腳本之前立即執行該函數)並依賴於以下內容 -

我要求一個文件兩次,它只加載一次?通過受歡迎的 需求,在yepnope 1.5+中,我們添加了這樣的功能,即在請求 第二次請求時,已請求的 腳本不會被重新執行。當您處理較少的 複雜服務器端模板系統並且您真正關心的是 您的所有依賴項都可用時,這可能會有所幫助。

在頁面我大概可以加載的jQuery從谷歌CDN,其基於上述實際上不會被加載兩次相同的版本,然後加載頁面的腳本從完整的函數調用的匿名函數的yepnope測試對象。

從好的一面來看,這意味着頁面不再依賴於從MasterPage加載的jQuery,但否定的是(即使假設YepNope現在不加載腳本兩次),我們將加載多個版本的jQuery應該改變MasterPage中的版本,而將來在頁面中不會發生同樣的情況。從維護的角度來看,我並不認爲這是一個好主意,尤其是在假設(我認爲你應該總是這樣)的假設下,另一名開發人員將成爲進行更改的人。

它似乎並不特別優雅。

總而言之,我幾乎肯定會使用第一個選項,但是我想知道是否有一種方法可以在頁面上延遲或推遲腳本,直到異步加載完成,並且這不能作爲YepNope測試的一部分來完成對象加載資源。

其他開發人員如何解決此問題?

回答

2

我想出了這個解決方案,我很喜歡。

在母版YepNope測試對象添加代碼 -

complete: function() { 
       if (window.pageFunctions !== null && typeof (window.pageFunctions) === "function") { 
        window.pageFunctions(); 
       } 
      } 

如果我想補充一點,依靠母版加載依賴任何JavaScript代碼或功能,我只是將它們包裝在一個名爲函數「pageFunctions 「像所謂

<script type="text/javascript"> 
    function pageFunctions() { 
     $(document).ready(function() { 
      ... 
     }); 
    } 
</script> 

我仍然有興趣在其他(可能更好)的解決方案,所以我要離開開了兩天的問題。

我也很感謝作爲解決方案的評論。