1. 程式人生 > >DOM加載順序

DOM加載順序

然而 head 圖片 比較 bar 不響應 底部 strong 如果

  最近一直在困擾dom的加載順序問題,經常會遇到以為綁定好的事件不響應等情況,一頭霧水,直到請教了周圍的同事,才發現了解dom的加載順序是多麽的重要。

  關於這個問題,其實網上已經有一些介紹,但是我覺得並不是特別準確,所以還是把自己理解的整理一下~

  瀏覽器解釋html文件中的所有內容是從上到下加載的!瀏覽器解釋html文件中的所有內容是從上到下加載的!瀏覽器解釋html文件中的所有內容是從上到下加載的!重要的事情說三遍。

找到CSS和JS的正確位置

  所以我們寫文件的時候,要把CSS樣式寫在head中, 如果放底部的話,頁面結構出來了,css還沒開始渲染。然而js文件卻應該盡量放在下面,除了少量輕量級、並且非常重要的js可以放在上面以外,剩下的都應該寫在body底部或body下面,尤其是大一些的js文件,最好也在最後引入。

加載順序

  現在就來說說dom的加載順序,其實dom的加載真的就是從上到下啊,都打好冒號敲好回車了竟然還是覺得寫成一段話比較明白。瀏覽器解釋文件會從上到下順序解釋,遇到樣式就把樣式加載到內存,遇到標簽就加載標簽,遇到js就加載js,遇到文件就先下載文件,然後加載裏面的內容,加完完內容之後就回到原ng頁面接著解釋。。。就是醬紫。。。

但是如果就是醬紫哪裏還用得著寫一篇博客呢?首先,今天我們說的所有都圍繞“瀏覽器解釋html文件中的所有內容是從上到下加載的”這句話閘門開的,由於這個特性,會導致很多問題。

不遇到不知道坑——知識點一

  那麽重點來了,首先在js方法調用上,由於都是解釋型語言,所以和python一樣,如果我們調用一個js中的方法,而這個js我們是在調用方法之後才引入,就會出現問題。例如:

<script src="/static/js/tree.js"></script>
<script src="/static/js/jquery-1.11.1.min.js"></script>

如上,如果我們在tree.js裏面用到了jquery-1.11.1.min.js中的內容,加載的時候就會出問題。。。簡單來說就是它還木有解釋道後面的js,也就不知道你寫的是什麽啦~~~

不遇到不知道坑——知識點二

  還有一點,我們在初學js的時候,很喜歡給標簽綁定function,就像下面這樣!

技術分享圖片
<script type="text/javascript">
    $(".nav").on("click","li",function(){
         alert(1)
    });
</script>
<ul class=‘nav‘>
    <li>example blablabla<li>
</ul>
技術分享圖片

  如上例,如果你寫成上面那個樣子,你就完了!!!因為解釋到“$(".nav").on("click","li",function(){”的時候還沒有這個nav class呢!這個時候怎麽辦呢?

<ul class=‘nav‘>
    <li>example blablabla<li>
</ul>
<script type="text/javascript">
    $(".nav").on("click","li",function(){
        alert(1)
      });
</script>

技術分享圖片
<ul class=‘nav‘>
    <li>example blablabla<li>
</ul>
<script type="text/javascript">
    $(".nav").on("click","li",function(){
        alert(1)
      });
</script>
技術分享圖片
<body>
    <script type="text/javascript">
        $("body").on("click",".nav li",function(){
            alert(1)
          });
    </script>
    <ul class=‘nav‘>
        <li>example blablabla<li>
    </ul>
</body>

技術分享圖片
<body>
    <script type="text/javascript">
        $("body").on("click",".nav li",function(){
            alert(1)
          });
    </script>
    <ul class=‘nav‘>
        <li>example blablabla<li>
    </ul>
</body>
技術分享圖片
<script type="text/javascript">
    $(function(){
    $(".nav").on("click","li",function(){
        alert(1)
      });
    });
</script>
<ul class=‘nav‘>
    <li>example blablabla<li>
</ul>

技術分享圖片
<script type="text/javascript">
    $(function(){
    $(".nav").on("click","li",function(){
        alert(1)
      });
    });
</script>
<ul class=‘nav‘>
    <li>example blablabla<li>
</ul>
技術分享圖片

  上面有三種解決方法,第一種就是把nav放上面去,先加載nav class,再綁定事件;第二種方法是把方法綁到已經加載的body上去,因為body是早就存在的標簽了,這裏比較有意思的是on方法,它的參數分別是event,target和function,這個target是click事件被觸發的時候才去找的,所以也就不會受順序問題影響了;最後一種方法,$(function(){}),這個是非常好用噠,意思是等到整個頁面加載完成之後,再執行裏面的方法,也就是說,我們有了這個方法,不管這個nav寫在哪裏,只要等到加載完在去綁定方法,就ok啦~~~

  就是醬,上面的三種方法,第2種和第3種都比較常用,第三種方法比較好理解了,第二種方法往往在實際的操作中容易出錯,但是用好了可以發揮更大的作用,自己體會下吧。

  有了上面這些基礎,就算遇到異步加載等復雜的問題,其實也是由最基本的原因引起的,遇到問題不要慌,一點點的尋找原因,計算機很單純,你說1它不會做2,總之它不對,一定不是它的錯~~~

DOM加載順序