來自《javascript高級程序設計 第三版:作者Nicholas C. Zakas》的學習筆記(二)
使用html標簽<script>可以把js嵌入到html頁面中,讓腳本與標記混合一起;也可以包含外部的js文件。如:
- 腳本和標記混合:
<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>
- 外部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>
學習筆記。