2015-03-31 42 views
0

我有一個大的JavaScript文件在網頁加載過程中使用。我希望它可以儘早下載(下載不會阻止UI線程),但不會立即評估(將它加載到內存中是在UI線程中,並阻止domcontentcomplete事件並因此阻止初始頁面繪製)。下載JavaScript文件,但不是馬上評價它?

它將啓動一個XHR來獲取更多數據並更新頁面。用戶會盡早看到靜態頁面,並稍後獲取所有數據。如果它在html頭部,則最初的靜態頁面顯示被延遲。如果在頁面末尾,則下載將延遲整個內容顯示。

有沒有辦法下載,但不解析,直到我以後啓動解析?

回答

1

如果JS文件對渲染不重要,則可以使用該文件的<script>標記上的asyncdefer屬性。使用async基本上與將<script>標籤放置在關閉<body>標籤之前的效果基本相同。

< Script > - MDN

異步

HTML5設置這個布爾值,表明瀏覽器 應該,如果可能的話,異步執行腳本。它對內聯腳本(即,沒有src 屬性的腳本)沒有 影響。

延遲

此布爾屬性被設置爲指示該腳本是指文件被解析後要執行的瀏覽器。由於此功能尚未由所有其他主要瀏覽器實施,因此作者不應假定腳本的執行實際上將被延期。

您也可以使用setTimeout調用。只要<script>不阻止任何渲染,將其包裝在setTimeout中應該會延遲它。

var delay = 10 /* or however many ms you want */ 
setTimeout(function(){ 
    /* your code goes here */ 
}, delay) 

編輯:如果你正在尋找的DomContentLoaded事件後具體執行,只是包裝你的代碼在事件監聽該事件。

document.addEventListener("DOMContentLoaded", function(event) { 
    /* Your code goes here */ 
    }); 
+0

異步是在下載文件時加載。在domcontetncomplete之後它不會推送加載。推遲是推遲頁面分頁,但在domcontentcomplete之前。 – lixuanzhu 2015-03-31 21:49:05

+0

我認爲你的意思是'DOMContentLoaded',沒有叫做'DomContentComplete'的事件。我已經爲您解決了一個可能的解決方案。 – Aweary 2015-03-31 21:57:32

+0

這是一個外部js文件。事件我將setTimeout中的所有代碼包裝在這個文件中,這太遲了,因爲那時js文件已經被解析了。將我的代碼附加到DomContentLoaded事件將在事件處理程序中運行我的代碼。我的理解是在DomContentLoaded事件完成後繪製頁面。 – lixuanzhu 2015-03-31 22:08:32

相關問題