當時的人們想,如何讓HTML與JavaScript共存,最終的決定就是為Web增加統一的腳本支持。
<script>元素
由Netscape創造,后來被加入HTML規范,共有6個可選屬性
- async:異步,只對外部腳本文件有效,表示應該立即下載腳本,但不妨礙頁面中的其他操作,比如下載其他資源或等待加載其他腳本
- charset:表示通過src屬性指定的代碼的字符集,不常用
- defer:表示腳本可以延遲到文檔完全被解析和顯示之后再執行。只對外部腳本文件有效
- language:廢棄了,原來用于表示編寫代碼使用的腳本語言
- src:要執行代碼的外部文件
- type:表示編寫代碼使用的腳本語言的內容類型(MIME),一般為text/javascript,服務器傳送時,使用application/x-javascript,約定俗稱使用text/javascript
使用<script>元素的方式有兩種:直接在頁面中嵌入JavaScript代碼和包含外部JavaScript文件
嵌入式JavaScript
<script type="text/javascript">
function sayHi(){
alert("Hi");
}
</script>
JavaScript代碼自上而下解釋,在解釋器對<script>元素內部的所有代碼求值完畢之前,頁面中的其余部分都不會被瀏覽器加載或顯示
在真正的</script>到達之前不應該出現</script>,字符串中也不例外,例如這樣:
<script type="text/javascript">
function sayHi(){
alert("</script>");
}
sayHi();
</script>
腳本被截斷
解決方案為在字符串中隨意插入一個轉義字符,其實在字符串</script>中沒有需要轉義的字符,比如</script>、</\script>、</s\cript>,目的就是不讓瀏覽器把字符串當成結束標簽,而字符串</script>、</\script>、</s\cript>都表示一樣的字符串
引入外部JavaScript
<script type="text/javascript" src="abc.js">
</script>
與解析嵌入式代碼一樣,解析外部JavaScript文件時,頁面的處理也會暫時停止(包括下載腳本時)
在有src屬性的<script>元素,標簽之間不可以包含額外的javascript代碼,包含了也只會下載并執行腳本文件,嵌入的代碼會被忽略
另外,src還可以引用外部域的腳本,無論如何包含代碼,只要不存在defer 和async ,瀏覽器都會按照<script>元素在頁面出現的先后順序對他們依次進行解析
<script>標簽一般放在head中,由于腳本會順序執行,有時會出現腳本加載緩慢,但是頁面不渲染的情況,瀏覽器在遇見<body>才會開始呈現內容(所有JavaScript腳本下載,解析,執行完畢后),現在一般都是放在<body>最后面
延遲腳本
<script defer="defer" src="abc.js">
</script>
表示腳本立即下載,延遲執行,延遲到瀏覽器遇見</html>后執行,如果有多個defer腳本,執行順序為在文檔中出現的順序。前邊所述為規范,實際情況為defer腳本不一定會按照順序執行。defer只支持外部腳本,有的瀏覽器會忽略defer腳本,所以把defer腳本放在頁面底部是最佳選擇
異步腳本
<script async src="abc.js">
</script>
表示立即下載腳本,但是不保證先后順序執行,目的是為了不讓加載腳本阻止瀏覽器渲染頁面,異步腳本一定會在頁面的load事件前執行
嵌入代碼與外部文件
雖然沒有使用外部文件的硬性規定,一般認為,最好的方法是使用外部文件,優點如下:
- 可維護性:JavaScript代碼集中
- 可緩存:如果多個HTML文件引用一個JavaScript文件,只下載一次就可以
- 可適應性:語法統一
文檔模式
統一使用<!DOCTYPE html> html5的模式