<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我思故我強

    JavaScript的執(zhí)行順序

    通常狀況下,javascript作為一種解釋性的腳本,都是從上而下順序執(zhí)行的,但是JavaScript還允許在其語句中嵌套,也就是這個樣子:

    document.write("<script>alert(t);</scr"+"ipt>");

    注意:</script>不能寫作</script>,要用字符串連接的形式來表述,否則會有語法錯誤,估計是因為JavaScript遇到</script>就以為腳本結(jié)束了。

    在這種情況下,正常的腳本和嵌入的腳本的執(zhí)行順序就需要研究一下了。



    b.js:

    alert("5");


    a.js:

    alert("4");
    document.write("<script src=b.js></scr"+"ipt>");
    alert("6");


    test.html:

    <script src=a.js></script>
    <script>
    alert("1");
    document.write("<script src=b.js></scr"+"ipt>");
    document.write("<script>alert("3")</scr"+"ipt>");
    alert("2");
    </script>



    執(zhí)行test.html,可以看到打印的順序是:4,6,5,1,3,2,5

    還可以做一些相關(guān)測試,得出的結(jié)論是:
    1.同級的不同的代碼塊,代碼塊間的執(zhí)行順序為從上到下;
    2.在代碼中嵌入代碼的情況下,先執(zhí)行上層代碼塊,再執(zhí)行子代碼塊;代碼中嵌入代碼是指一個文件引入另一個文件,而不是指所有的通過document.write形式打出的代碼。
    ---------------------------------------------------------------------------------------------

    一、在HTML中嵌入Javasript的方法

    1. 直接在Javascript代碼放在標記對<script>和</script>之間
    2. 由<script />標記的src屬性制定外部的js文件
    3. 放在事件處理程序中,比如:<p onclick="alert('我是由onclick事件執(zhí)行的Javascript')">點擊我</p>
    4. 作為URL的主體,這個URL使用特殊的Javascript:協(xié)議,比如:<a href="javascript:alert('我是由javascript:協(xié)議執(zhí)行的javascript')">點擊我</a>
    5. 利用javascript本身的document.write()方法寫入新的javascript代碼
    6. 利用Ajax異步獲取javascript代碼,然后執(zhí)行

    第3種和第4種方法寫入的Javascript需要觸發(fā)才能執(zhí)行,所以除非特別設(shè)置,否則頁面加載時不會執(zhí)行。

    二、Javascript在頁面的執(zhí)行順序

    1. 頁面上的Javascript代碼是HTML文檔的一部分,所以Javascript在頁面裝載時執(zhí)行的順序就是其引入標記<script />的出現(xiàn)順序, <script />標記里面的或者通過src引入的外部JS,都是按照其語句出現(xiàn)的順序執(zhí)行,而且執(zhí)行過程是文檔裝載的一部分。
    2. 每個腳本定義的全局變量和函數(shù),都可以被后面執(zhí)行的腳本所調(diào)用。
    3. 變量的調(diào)用,必須是前面已經(jīng)聲明,否則獲取的變量值是undefined。
      <script type="text/javscrpt">//<![CDATA[
      alert(tmp);??//輸出 undefined
      var tmp = 1;alert(tmp);??//輸出 1
      //]]></script>
    4. 同一段腳本,函數(shù)定義可以出現(xiàn)在函數(shù)調(diào)用的后面,但是如果是分別在兩段代碼,且函數(shù)調(diào)用在第一段代碼中,則會報函數(shù)未定義錯誤。
      <script type="text/javscrpt">//<![CDATA[
      aa(); //瀏覽器報錯
      //]]></script>
      <script type="text/javscrpt">//<![CDATA[
      aa();???//輸出 1
      function aa(){
      ?? alert(1);}
      //]]></script>
    5. document.write()會把輸出寫入到腳本文檔所在的位置,瀏覽器解析完documemt.write()所在文檔內(nèi)容后,繼續(xù)解析document.write()輸出的內(nèi)容,然后在繼續(xù)解析HTML文檔。
      <script type="text/javascript">//<![CDATA[?????
      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">//<![CDATA[?????
      alert(3);?????
      //]]></script>

      test.js的內(nèi)容是:

      var tmpStr = 1;????? alert(tmpStr);
      • 在Firefox和Opera中的彈出值的順序是:1、2、我是1、3
      • 在IE中彈出值的順序是:2、1、3,同時瀏覽器報錯:tmpStr未定義

      原因可能是IE在document.write時,并未等待加載SRC中的Javascript代碼完畢后,才執(zhí)行下一行,所以導(dǎo)致2先彈出,并且執(zhí)行到document.write(’document.write("我是" + tmpStr)’)調(diào)用tmpStr時,tmpStr并未定義,從而報錯。

      解決這個問題,可以利用HTML解析是解析完一個HTML標簽,再執(zhí)行下一個的原理,把代碼拆分來實現(xiàn):

      <script type="text/javascript">//<![CDATA[?????
      document.write('<script type="text/javascript" src="test.js">
      <\/script>');?????
      //]]></script>???
      <script type="text/javascript">//<![CDATA[?????
      document.write('<script type="text/javascript">');?????
      document.write('alert(2);')?????
      document.write('alert("我是" + tmpStr);');?????
      document.write('<\/script>');?????
      //]]></script>???
      <script type="text/javascript">//<![CDATA[?????
      alert(3);????? //]]>
      </script>

      這樣IE下和其他瀏覽器輸出值的順序都是一直的了:1、2、我是1、3。

    三、如何改變Javascript在頁面的執(zhí)行順序

    1. 利用onload
      <script type="text/javascript">//<![CDATA[
      window.onload = f;
      function f(){
      ??? alert(1);
      }alert(2);
      //]]></script>

      輸出值順序是 2、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);...
      }
    2. IE中可以利用deferdefer作用是把代碼加載下來,并不立即執(zhí)行,等文檔裝載完畢之后再執(zhí)行,有點類似onload,但是沒有onload那樣的局限性,可以重復(fù)使用,但是只在IE中有效,所以上面的例子可以修改成為
      <script type="text/javascript">//<![CDATA[
      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">//<![CDATA[
      alert(3);
      //]]></script>

      這樣IE就不報錯了,輸出值的順序變成:1、3、2、我是1

    3. 利用Ajax。
      因為xmlhttpRequest能判斷外部文檔加載的狀態(tài),所以能夠改變代碼的加載順序。

    posted on 2007-09-19 19:56 李云澤 閱讀(2608) 評論(0)  編輯  收藏 所屬分類: javascript

    主站蜘蛛池模板: 在线精品免费视频| 国产精品玖玖美女张开腿让男人桶爽免费看 | 亚洲av无码天堂一区二区三区| 国产成人亚洲综合色影视| 亚洲AV无码片一区二区三区| 日韩免费人妻AV无码专区蜜桃| 亚洲精品国产高清嫩草影院| 亚洲中文字幕无码一去台湾| 日本卡1卡2卡三卡免费| 亚洲精品成人片在线观看| 亚洲国产成人久久一区二区三区| 狼群影院在线观看免费观看直播| 亚洲精品无码av人在线观看| 日本高清免费中文在线看| 亚洲AV无码成人精品区大在线| 亚洲小说图区综合在线| 日韩精品无码免费一区二区三区| 亚洲熟妇av一区二区三区漫画| 国产免费久久精品丫丫| 免费人成视频在线观看视频| 亚洲国产美女精品久久久 | 91在线视频免费观看| 免费国产a国产片高清网站| 亚洲人成色4444在线观看| 免费H网站在线观看的| 亚洲视频在线观看网址| 最近中文字幕大全中文字幕免费| 久久精品国产亚洲麻豆| 野花香在线视频免费观看大全| 亚洲国产成人高清在线观看 | 色www免费视频| 啊v在线免费观看| 日本中文字幕免费看| 亚洲综合亚洲综合网成人| 九九99热免费最新版| 国产亚洲综合成人91精品| 精品视频一区二区三区免费| 无码专区—VA亚洲V天堂| 日韩精品极品视频在线观看免费| 亚洲日本中文字幕区| 一个人在线观看视频免费 |