js和HTML結合(補充知識:如何防止文件緩存的js代碼)


  來自《javascript高級程序設計 第三版:作者Nicholas C. Zakas》的學習筆記(二)

 

  使用html標簽<script>可以把js嵌入到html頁面中,讓腳本與標記混合一起;也可以包含外部的js文件。如:

  1. 腳本和標記混合:
    <script type="text/javascript">
        function sayHi(){
          alert("Hi");      
        }
    </script>

    在使用<script>嵌入代碼時,記住不要在代碼中的任何地方出現'<script>'字符串。例如,

    <script text="text/javascript">
        function sayScript(){
            alert("</script>");
        }
    </script>

    瀏覽器在加載上述代碼時將會報錯,因為當瀏覽器遇到字符串</script>時,就會認為那是結束的</script>標簽。解決辦法如下:

    <script text="text/javascript">
        function sayScript(){
            alert("<\/script>");
        }
    </script>
  2. 外部js文件的鏈接,例如:
    <script type="text/javascript" src="example.js"></script>

    需要注意的是:帶有src屬性的<script>元素不應該在其<script></script>標簽之間有額外js代碼。只會下載並執行外部腳本文件,嵌入的代碼會被忽略。src屬性還可以包含來自外部域的js文件,如:

    <script type="text/javascript" src="http://www.somewhere.com/afile.js"></script>

    不過隨意加載外部域js文件存在潛在危險,需要引起警惕。 

  而我們需要注意的地方有:

  • 在包含外部js文件時,必須將src屬性設置為指向相應文件的URL。而這個文件可以與包含它的頁面位於同一個服務器上,也可以是其他任何域中的文件(如:)
  • 所有<script>元素都會按照它們在頁面中出現的先后順序依次被解析。在不使用defer和async屬性的情況下,只有在解析完前面<script>元素中的代碼之后,才會開始解析后面<script>元素中的代碼(后面將會補充defer和async的知識,就如你此時腦瓜子里猜測的那樣,defer和async就是能夠控制解析順序的。不過還有細節方面的知識,如果您此時已經迫不及待想知道,可以先翻閱到該文章的相應段落,搶先閱讀)。
  • 由於瀏覽器會先解析完不使用defer屬性的<script>元素中的代碼,然后再解析后面的內容,所以一般應該把<script>元素放在頁面最后,即主要內容后面,</body>標簽前面。從而可以避免出現js文件下載過慢出現頁面無法渲染的情況。
  • 使用defer屬性可以讓腳本在文檔完全呈現之后執行。延遲腳本總是按照指定它們的順序執行。
  • 使用async屬性可以表示當前腳本不必等待其他腳本,也不必阻塞文檔呈現。不能保證異步腳本按照它們在頁面中出現的順序執行。
  • 使用<noscript>元素可以指定不支持腳本的瀏覽器中顯示的替代內容。但在啟動了腳本的情況下,瀏覽器不會顯示<noscript>元素中的任何內容。

  

  defer和async介紹:

  標簽<script>的defer屬性的定義(defer只適用於外部腳本),是腳本會被延遲到整個頁面都解析完畢后再運行。這個屬性的用途表明腳本在執行時不會影響頁面的構成。如:

<script type="text/javascript" defer="defer" src="example1.js"></script>
<script type="text/javascript" defer="defer" src="example2.js"></script>

  需要注意的是,現實生活中,example1.js和example2.js雖然延遲了,但是彼此作為都是延遲腳本並不是example1.js一定會先於example2.js執行,也不一定會在DOMContentLoaded事件觸發前執行,因此最好只包含一個延遲腳本。

  同樣屬性async也只適用於外部腳本,並告訴瀏覽器立即下載文件,但不妨礙頁面中的其它操作,比如下載其它資源或是等待加載其它腳本。標記為async的腳本並不保證按照指定它們的先后順序執行。所以。確保兩者之間互不依賴非常重要。指定async屬性的目的是不讓頁面等待兩個腳本執行和下載,從而異步加載頁面其它內容。建議異步腳本不要在加載期間修改DOM。

 

  補充:如何防止瀏覽器緩存外部js文件,很多時候用於動態驗證碼等需要多次加載文件的時候。

  原理其實就是通過在固定地址后面,加上一個不同值的日期數值,以達到地址不重復的目的,讓瀏覽器每次都實時加載,不從緩存中讀取文件。

<script type="text/javascript"> 
//防止js文件緩存下來,以后更新時不再需要用戶重新刪除IE文件等操作。 
var now=new Date(); 
var number = now.getYear().toString()+now.getMonth().toString()+now.getDate().toString()+now.getHours().toString()+now.getMinutes().toString()+now.getSeconds().toString(); 
document.write('<scr'+'ipt language="javascript" type="text/javascript" src="jb51net.js?"+number+""></scr'+'ipt>'); 
</script> 

 

  學習筆記。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM