1. 程式人生 > >讀《高效能 JavaScript》筆記 -”JS進階必讀“(第一章)

讀《高效能 JavaScript》筆記 -”JS進階必讀“(第一章)

一, 載入和執行

        1.0指令碼位置,由於 javaScript的阻塞特性,指令碼位置可以放在<body>標籤底部 ,以儘量減少整個頁面下載的影響。

<html>
  <head>
   <title>下載的js檔案 儘可能放在body標籤底部</title>
   <body>
      <p>hello world~</p>
      <--放在這裡-->
      <script type="text/javascript" src="file1.js"></script>
      <script type="text/javascript" src="file2.js"></script>
      <script type="text/javascript" src="file3.js"></script>
   </body>
  </head>
</html>

       1.1 當然<script>標籤初始下載時會阻塞頁面渲染,合併指令碼,減少<script>標籤,無論外鏈檔案還是內嵌檔案都是如此。

<html>
  <head>
   <title>下載的js檔案 儘可能放在body標籤底部</title>
   <body>
      <p>hello world~</p>
      <--可用雅虎提供的合併處理器,以供通過他們的內容傳輸網路(CDN)來分發
    Yahoo!User Interface(YUI)Library檔案  可以使用一個url來獲取任意數量的YUI檔案 -->
      <script type="text/javascript" 
      src="http//yui.yahooapis.com/file1.js&file2.js&file3.js"></script>
   </body>
  </head>
</html>

      1.2 無阻塞的指令碼的祕笈在於,在頁面載入完後下載JavaScript程式碼。用專業術語來說,這意味著在window物件的load事件觸發後再下載指令碼。 

      1.3 延遲指令碼,Html4 為<script>標籤定義了一個擴充套件屬性:defer ,目標瀏覽器支援的話,也是一個有用的解決指令碼下載阻塞的方案,帶有defer屬性的JavaScript檔案下載的時,它不會阻塞瀏覽器的其他程序,因此這類檔案可以與頁面中的其他資源並行下載。

<html>
  <head>
   <title>script defer example</title>
   <body>
      <p>hello world~</p>
      <script defer>alert("defer")</script>
      <script>alert("script")</script>
      <script>
        window.onload=function(){
          alert("load"); 
       }
      </script>
      <p>支援defer的瀏覽器 列印結果順序為:"script", "defer" ,"load"
   注意!!! 帶有 defer的script標籤 是在onload執行之前呼叫 而不是跟著第二個後面</p>   
    </body>
  </head>
</html>

   1.3動態指令碼元素,使用動態建立的<script>元素來下載並執行程式碼。

//下面的函式封裝來標準及IE特有的實現方法
//loader.js
function loadScript(url,callback){
    var script = document.createElement("script")
    script.type = "text/javascript";

    if(script.readyState){//IE
      script.onreadstatechange = function(){
          if(script.readyState == "loaded"||script.readyState == "complete"){
           script.onreadychange = null;
           callback();
          }
      }
    }else{//other 瀏覽器
         script.onload = function(){
            callback();
         };
    }

    script.src=url;
    document.getElemenByTagName("head")[0].appendChild(script);
}


//使用 單檔案
loadScript("file1.js",function(){
       alert("File is loaded!!!")
    })

//使用 多檔案
loadScript("file1.js",function(){
       loadScript("file2.js",function(){
         alert("All File is loaded!!!")
       })
    })

1.4 XMLHttpRequest 指令碼注入

var xhr = new XMLHttpRequest();
xhr.open("get","file1.js",true);
xhr.onreadystatechange=function(){
    if(xhr.readystate == 4){
      if(xhr.states >= 200 && xhr.states <300 || xhr.states  == 304){
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.text = xhr.responeText;
        document.body.appendChild(script);
      }
    }
}
xhr.send(null);

1.5向頁面新增大量的JavaScript程式碼只需要兩步1.新增動態載入所需的程式碼 2.載入初始化頁面所需要的剩下程式碼

//放在<body>標籤閉合之前   loader.js 上面1.3處程式碼
<script type="text/javascript" src="loader.js"></script> //步驟一
<script type="text/javascript" >//步驟二
    loadScript("the-rest.js",funciton(){
           application.init();
    })
</script>

注意:如有版本問題 請聯絡我~