1. 程式人生 > >JavaScript之js非同步載入精解

JavaScript之js非同步載入精解

        在解釋之前先鋪墊幾個知識點。

        DomTree:在頁面渲染時候會把html構建成一個樹形結構,把標籤全部掛在樹形結構上,構建DOM樹採用深度優先原則。

        Dom解析:繪製DOM樹過程中,當遇到外部引入的檔案標籤時候,不用等到DOM元素全部載入完成再放到DOM樹上,只知道是什麼就可以了,DOM樹的構建完畢表示所有DOM節點解析完畢。

        CssTree:當DOM樹構建完畢之後,開始構建CSS樹,構建CSS樹規則和構建Dom樹一樣採用深度優先原則。

        randerTree:當CSS樹構建完畢之後,CSS樹和Dom樹合成rander樹

        當randerTree構建完成之後,瀏覽器開始渲染頁面。渲染引擎按照randerTree的規則渲染。

        當我們渲染完成頁面的時候,有時候需要js事件去動態改變頁面中Dom元素,改變Dom元素有兩種,一種是重排,一種是重繪。

        重排:reflow----浪費瀏覽器效率。能產生重排的有:dom節點的刪除和增加。dom節點的寬高變化,dom節點的位置變化,offsetWidth/offsetHeight,
重繪:repaint----重排的是html文件頁面,而重繪的是css,相對於重排,浪費瀏覽器效率所造成的影響較小。
        終於到正文了,我們看了上面我們知道,當瀏覽器繪製頁面的時候,js有時候會載入不當會阻礙頁面的繪製。

        js載入的缺點

        載入工具方法沒必要阻塞文件,過得js載入會影響頁面載入效率,當網速不好的時候,那麼整個網站將等待js載入而不進行後續渲染。
        有些工具有時候需要按需載入,用到時候再載入,不用就不載入。

js非同步載入的三種方法

                defer = “defer”
                defer非同步載入,但要等到Dom文件全部解析完成之後才被執行,只能IE9一下能用,也可以將程式碼寫到內部
<script type="text/javascript" src = "demo.js" defer = "defer"></script>
<script defer = "defer">
console.log("a");
</script>
上面兩種方式都可以。
                async = “async”
                async非同步載入,載入完成就執行,async只能載入外部指令碼,不能把程式碼寫到script標籤裡面。
   
<script  type ="text/javascript" src = "demo.js" async = "async"></script>
                預載入--非同步
                我們知道document可以建立Dom標籤,我們可以當我們需要外部js的時候建立script標籤,
var script = document.createElement('script');
script.src = 'demo.js';
script.type = 'text/javascript';
document.head.appendChild(script);
        我們知道執行上述程式碼是需要耗時間的,當demo.js中有個a函式功能是輸出a,此時我們執行a(),肯定會報錯,因為,當我們程式碼還沒有解析完成之後我們執行a(),此時a函式還沒有解釋出來,所以報錯,        預載入必須下載完成之後才能執行,load事件不只是window上有,script上也有,load事件可以當預載入完成之後再執行,相容性很好,但是有個重要的缺點:IE上沒有。
script.onload = function(){
a();
}
        不相容IE,這麻煩大了,但是IE自己有辦法,在IE上script上有個狀態碼,script.readyState。這個屬性裡面有值,當正在載入時候,script.readyState = “loading”,當載入完成之後,script.readyState = "loaded" 或者 script.readyState = "complete",        出現上面這個東西,當然IE不會讓它自己孤獨著,在IE裡script標籤有個readyStatechange事件,這個事件監聽的是,當script.readyState值變化的時候觸發事件,
script.onreadyStatechange = function(){
if(scriptreadyState == "loaded" || script.readyState == "complete".){
//程式碼執行
}
}
        最後我們封裝函式,實現我們按需載入的功能。
                function loadScript(url,callback){
                        var script = document.createElement('script');
                        script.type = "text/javascript";
                        if(script.readyState){
                            script.onreadyStatechange = function(){
                                if (script.readyState == "loaded" || script.readyState == "complete") {
                                    obj[callback]();
                                }
                            }    
                        }else{
                            script.onload = function(){
                                obj[callback]();
                            }
                        }
                        script.src = url;
                        document.head.appendChild(script);
                    }
                    loadScript('demo.js','test');

           

JavaScript語言我個人感覺是最有意思的了,我也是一個初學者,遇到問題,喜歡在部落格上分享,

也希望能幫到大家。一個初學者,有什麼不足或者紕漏的話,希望在下面評論出來,相互學習,共同進步

--主頁傳送門--

相關推薦

JavaScriptjs非同步載入

        在解釋之前先鋪墊幾個知識點。        DomTree:在頁面渲染時候會把html構建成一個樹形結構,把標籤全部掛在樹形結構上,構建DOM樹採用深度優先原則。        Dom解析:繪製DOM樹過程中,當遇到外部引入的檔案標籤時候,不用等到DOM元素全

Javascript 非同步載入(轉)

本文總結一下瀏覽器在 javascript 的載入方式。 關鍵詞:非同步載入(async loading),延遲載入(lazy loading),延遲執行(lazy execution),async 屬性, defer 屬性 一、同步載入與非同步載入的形式 1. 同步載入 我們平時最常使用

[js點滴]JavaScriptCookie/Session機制詳01

一 基本概念 會話(Session)跟蹤是Web程式中常用的技術,用來跟蹤使用者的整個會話。 常用的會話跟蹤技術是Cookie與Session。 1).Cookie通過在客戶端記錄資訊確定使用者身份 2).Session通過在伺服器端記錄資訊確定使

js 非同步載入

一、為什麼要JS非同步載入? 因為同步載入存在問題! JS在預設情況下是以同步模式(又稱阻塞模式)載入的,這裡“載入”的意思是“解釋、執行”。在最新版本的瀏覽器中,瀏覽器對於程式碼請求的資源都是瀑布式的載入,而不是阻塞式的,但是JS的執行總是阻塞的。這會引起什麼問題呢?如果在頁面中載

js-JSON, js非同步載入

1. JSON json是一種傳輸資料的格式(以物件為樣板,本質上就是物件,但用途有區別,物件是本地的,JSON是用於傳輸的。 JSON.parse();//string --> json JSON.stringify();//json --> string 2. 頁面渲染

字元裝置驅動------非同步通知 按鍵使用非同步通知(詳)

引入: 按鍵驅動方式對比 查詢:一直讀,耗資源 中斷: 沒有超時機制,當沒有中斷,read函式一直休眠 poll機制,加入超時機制 以上3種,都是讓應用程式主動去讀,本節我們學習非同步通知,它的作用就是當驅動層有資料時,主動告訴應用程式,然後應用程式再來讀, 這樣,應用程式就可以幹其它

turn.js 非同步載入實現翻書效果

1、閱讀翻書js /** * 電子翻書 */ //var width = 1080; //var height = 1680; var width = "10rem"; var height = "15.2rem"; window.onload = function

JS非同步載入的三種方式

非同步載入又叫非阻塞載入,瀏覽器在下載執行js的同時,還會繼續進行後續頁面的處理。主要有三種方式。 方法一:也叫Script DOM Element (function(){ var scriptEle = document.createElement("script"); script

頁面優化——js非同步載入

同步載入 在介紹js非同步載入之前,我們先來看看什麼是js同步載入。我們平時最常使用的就是這種同步載入形式: <script src="http://XXX.com/script.js"></script> 同步模式,又稱阻塞模式,會阻止瀏覽器

js非同步載入的四種解決方案

js非同步載入的4種方式,點評開始。 方案1:$(document).ready <!DOCTYPE html> <html> <head> <script src="http://commo

Android學習圖片非同步載入框架Picasso

原創地址:http://mcode114.com/android/network/picasso/ Picasso Picasso是Square公司開源的一個Android圖形快取庫。可以實現圖片下載和快取功能。僅僅只需要一行程式碼就能完全實現圖片的非同步載入。使用複

淺談android中非同步載入"取消非同步載入"二

首先,我得解釋一下為什麼我的標題取消非同步載入打引號,這是因為可能最後實現效果並不是你自己想象中的那樣。大家看取消非同步載入,這不是很簡單嗎?AsyncTask中不是有一個cancel方法嗎?直接呼叫該方法不就行了嗎?但是事實上是這樣的嗎?如果真是這樣,我相信我就沒有以寫這

js 非同步載入和json格式

1:json解析 <!--json--> var json = { name: "json", age: 123 } var str

JS非同步載入的幾種方式

1、同步載入我們平常寫JS的時候都是用的阻塞模式如<script type="text/javascript" src="../../libs/crypto/abc.js" ></script> <script type="text/javasc

Echarts擴充套件ajax非同步載入tooltip資料

最近做大資料視覺化檢視展現,隨著業務的加深,正常的簡單的echars裡面的例項已經滿足不了現有的需求;所以就需要對echarts進行更深一步的瞭解; 因為接觸echars比較早,所以現在使用的是echarts的2.*版本;最新的echarts3添加了非常多的人性化的設計;非

htmlunit爬取js非同步載入後的頁面

直接上程式碼: 一、 index.html 呼叫後臺請求獲取content中的內容。 <html> <head> <script type="text/j

JavaScriptJS資料型別轉換

前言 在js中,資料型別轉換分為顯式資料型別轉換和隱式資料型別轉換。 JavaScript的資料型別分為六種,分別為null,undefined,boolean,string,number,object。 object是引用型別,其它的五種是基本型別或者是

JavaScript——從setTimeout()的執行了js的單執行緒和非同步

眾所周知,JavaScript是單執行緒的,那麼到底什麼是單執行緒呢?今天我們就用setTimeout()舉例,看看單執行緒到底是什麼樣的。 單執行緒,從名字就能知道,它只有一個主執行緒。單執行緒就意味著,所有任務需要排隊,前一個任務結束,才會執行後一個任務。如果前一個任務

網頁效能優化非同步載入js檔案

一個網頁的有很多地方可以進行效能優化,比較常見的一種方式就是非同步載入js指令碼檔案。在談非同步載入之前,先來看看瀏覽器載入js檔案的原理。 瀏覽器載入 JavaScript 指令碼,主要通過<script>元素完成。正常的網頁載入流程是這樣的。 瀏覽器一邊下載 HTML 網頁,一邊開始解析。

JavaScript 非同步載入 defer和async的區別

按照慣例,所有script元素都應該放在頁面的head元素中。這種做法的目的就是把所有外部檔案(CSS檔案和JavaScript檔案)的引用都放在相同的地方。可是,在文件的head元素中包含所有JavaScript檔案,意味著必須等到全部JavaScript