Js中對外部js文件的引用順序直接影響到未定義的有關問題

Js中對外部js文件的引用順序直接影響到未定義的問題
javascript

  1、在HTML中嵌入Javasript的方法
  1.直接在Javascript代碼放在標記對<script>和</script>之間,由<script />標記的src屬性制定外部的js文件 
  2.放在事件處理程序中,好比:<p onclick="alert('我是由onclick事件執行的Javascript')">點擊我</p> 
  做爲URL的主體,這個URL使用特殊的Javascript:協議,好比:<a javascript:alert('我是由javascript:協議執行的javascript')">點擊我</a> 
  3.利用javascript自己的document.write()方法寫入新的javascript代碼 
  4.利用Ajax異步獲取javascript代碼,而後執行 
  第3種和第4種方法寫入的Javascript須要觸發才能執行,因此除非特別設置,不然頁面加載時不會執行。
  2、Javascript在頁面的執行順序
  頁面上的Javascript代碼是HTML文檔的一部分,因此Javascript在頁面裝載時執行的順序就是其引入標記<script />的出現順序, <script />標記裏面的或者經過src引入的外部JS,都是按照其語句出現的順序執行,並且執行過程是文檔裝載的一部分。 
  每一個腳本定義的全局變量和函數,均可以被後面執行的腳本所調用。 
  變量的調用,必須是前面已經聲明,不然獲取的變量值是undefined。 
  java

<script type="text/javscrpt">
       alert(tmp); //輸出 undefined
       var tmp = 1;
       alert(tmp); //輸出 1
</script>

  同一段腳本,函數定義能夠出如今函數調用的後面,可是若是是分別在兩段代碼,且函數調用在第一段代碼中,則會報函數未定義錯誤。 
  瀏覽器

<script type="text/javscrpt">
       aa(); //瀏覽器報錯
</script>

<script type="text/javscrpt">
       aa(); //輸出 1 
       function aa(){alert(1);}
/script>

  document.write()會把輸出寫入到腳本文檔所在的位置,瀏覽器解析完documemt.write()所在文檔內容後,繼續解析document.write()輸出的內容,而後在繼續解析HTML文檔。(特殊符號沒有處理,不然很難看...
  <script type="text/javascript">
       document.write('<script type="text/javascript" src="test.js"></script>);
       document.write('<script type="text/javascript">);
       document.write('alert(2);')
       document.write('alert("我是" + tmpStr);');
異步

            document.write('</script>');函數

        </script>性能

   <script type="text/javascript">
       alert(3);
   <script>
  test.js的內容是:
  var tmpStr = 1;
   alert(tmpStr);
  在Firefox和Opera中的彈出值的順序是:一、二、我是一、3 
  在IE中彈出值的順序是:二、一、3,同時瀏覽器報錯:tmpStr未定義 
  緣由多是IE在document.write時,並未等待加載SRC中的Javascript代碼完畢後,才執行下一行,因此致使2先彈出,而且執行到document.write(’document.write("我是" + tmpStr)’)調用tmpStr時,tmpStr並未定義,從而報錯。
  解決這個問題,能夠利用HTML解析是解析完一個HTML標籤,再執行下一個的原理,把代碼拆分來實現:
  <script type="text/javascript">
      document.write('<script type="text/javascript" src="test.js"></script>);
   </script>
   <script type="text/javascript">
       document.write('<script type="text/javascript">);
       document.write('alert(2);')
       document.write('alert("我是" + tmpStr);');
       document.write('</script>);
  </script>spa

   <script type="text/javascript">
       alert(3);
   </script>  code

這樣IE下和其餘瀏覽器輸出值的順序都是一直的了:一、二、我是一、3。 
  3、如何改變Javascript在頁面的執行順序
  利用onload 
  <script type="text/javascript">
       window.onload = f;
       function f(){alert(1);}
       alert(2);
  </script>orm

  輸出值順序是 二、1。
  須要注意的是,若是存在多個winodws.onload的話,只有最有一個生效,解決這個辦法是:
  window.onload = function(){f();f1();f2();.....}
  利用2級DOM事件類型
  if(document.addEventListener){
   window.addEventListener('load',f,false);
   window.addEventListener('load',f1,false);
   ...
   }else{
   window.attachEvent('onload',f);
   window.attachEvent('onload',f1);
   ...
   }
  IE中能夠利用defer,defer做用是把代碼加載下來,並不當即執行,等文檔裝載完畢以後再執行,有點相似window.onload,可是沒有window.onload那樣的侷限性,能夠重複使用,可是隻在IE中有效,因此上面的例子能夠修改爲爲 
  <script type="text/javascript">
       document.write('<script type="text/javascript" src="test.js"></script>);
       document.write('<script type="text/javascript" defer="defer">);
       document.write('alert(2);')
       document.write('alert("我是" + tmpStr);');
       document.write('</script>);
   </script>事件

   <script type="text/javascript">
       alert(3);
   </script>

  這樣IE就不報錯了,輸出值的順序變成:一、三、二、我是1  當HTML解析器遇到一個腳本,它必須按常規終止對文檔的解析並等待腳本執行。爲了解決這個問題HTML4標準定義了defer。經過defer來提示瀏覽器能夠繼續解析HTML文檔,並延遲執行腳本。這種延遲在腳本從外部文件載入時很是有用,讓瀏覽器沒必要等待外部文件所有載入以後才繼續執行,能有效的提升性能。IE是目前惟一支持defer屬性的瀏覽器,但IE並無正確的實現了defer屬性,由於延遲的腳本老是被延遲,直到文檔結束,而不是隻延遲到下一個非延遲的腳本。這意味着,IE中延遲的腳本的執行順序至關混亂,而且不能定義任何後面非延遲腳本並須的函數和變量。在IE中全部的defer的腳本執行時間應該都是HTML文檔樹創建之後,window.onload以前

相關文章
相關標籤/搜索