在HTML中添加JavaScript的主要方法,就是使用<script>元素。
HTML4.01為<script>添加了6個(gè)屬性
① async: 可選恤筛,表示立即下載腳本,但是不妨礙頁(yè)面中的其他操作芹橡,只對(duì)外部腳本文件有效
② charset: 可選毒坛, 表示通過(guò)src屬性指定的代碼的字符集,這個(gè)值已經(jīng)很少有人用了林说,大多數(shù)的瀏覽器也會(huì)忽略它的值
③ defer: 可選煎殷,表示腳本可以延遲到文檔完全被解析和顯示之后執(zhí)行。只對(duì)外部腳本文件有效腿箩,IE7及更早的版本對(duì)嵌入腳本也支持這個(gè)屬性
④ language: 已廢棄豪直,表示編寫(xiě)代碼使用的腳本語(yǔ)言
⑤ src: 可選, 表示包含要執(zhí)行代碼的外部文件
⑥ type: 可選珠移, 表示編寫(xiě)代碼使用的腳本語(yǔ)言的內(nèi)容類(lèi)型弓乙,MIME類(lèi)型,默認(rèn)值是 text/javascript
使用<script>元素的方式有兩種
1钧惧、直接在頁(yè)面中嵌入JavaScript代碼
包含在<script>元素內(nèi)部的JS代碼會(huì)被從上到下的順序依次執(zhí)行暇韧,
在使用<script>嵌入JS代碼時(shí),不要在代碼中的任何地方出現(xiàn)“</script>“字符串浓瞪,否則就會(huì)被認(rèn)為是結(jié)束的</script>標(biāo)簽懈玻。如果避免不了要使用可以通過(guò)轉(zhuǎn)義字符“\”解決這個(gè)問(wèn)題。
2乾颁、包含外部的JavaScript文件
如果要通過(guò)<script>元素來(lái)包含外部的JS文件涂乌,那么src屬性就是必需的。這個(gè)屬性就是指向外部JS的鏈接地址钮孵,例如:
<script src="js/demo.js" type="text/javascript"></script>
這樣外部文件demo.js就被加載到當(dāng)前的頁(yè)面中骂倘。
與解析嵌入式JS代碼一樣,在解析外部JS文件時(shí)巴席,頁(yè)面的處理會(huì)暫時(shí)停止历涝。
需要注意的是,在帶有src屬性的<script>元素中不應(yīng)該在其<script>與</script>之間在包含額外的JS代碼,如果包含了漾唉,則會(huì)被忽略不執(zhí)行荧库。
只要不存在defer和async屬性,瀏覽器就會(huì)按照<script>元素在頁(yè)面中出現(xiàn)的先后順序依次解析赵刑。
標(biāo)簽的位置
按照傳統(tǒng)的做法分衫,所有<script>元素都應(yīng)該放在<head>元素中,這樣使頁(yè)面中所有外部文件的引用都放在相同的地方般此。前邊說(shuō)過(guò)蚪战,在JS文件加載解析時(shí)牵现,頁(yè)面會(huì)暫時(shí)停止,這樣對(duì)于有很多JS的頁(yè)面來(lái)說(shuō)邀桑,會(huì)導(dǎo)致瀏覽器在呈現(xiàn)頁(yè)面前出現(xiàn)明顯的延遲瞎疼,延遲期間,瀏覽器窗口是一邊空白壁畸,這對(duì)于用戶(hù)來(lái)說(shuō)是很不友好的行為贼急。
為了避免這個(gè)問(wèn)題,現(xiàn)代的web應(yīng)用程序都把全部JS引用放在<body>元素中頁(yè)面內(nèi)容的后面
<!DOCTYPE html>
<html>
<head>
<title>DEMO</title>
</head>
<body>
<!-- 頁(yè)面內(nèi)容 -->
<script src="js/demo1.js" type="text/javascript"></script>
<script src="js/demo2.js" type="text/javascript"></script>
</body>
</html>
這樣捏萍,頁(yè)面的內(nèi)容完全加載在瀏覽器之后太抓,才會(huì)解析JS代碼,很大程度上改善頁(yè)面延遲的問(wèn)題令杈。
延遲腳本
(可忽略不看)
前邊提到<script>標(biāo)簽的defer屬性走敌,為什么不添加defer屬性,而是要把文件放在頁(yè)面的后面这揣?
添加defer屬性悔常,腳本會(huì)被延遲到整個(gè)頁(yè)面都解析完畢之后再運(yùn)行,相當(dāng)于告訴瀏覽器立即下載给赞,但延后執(zhí)行
在HTML5規(guī)范中要求腳本按照他們出現(xiàn)的先后順序執(zhí)行机打,在現(xiàn)實(shí)中,延遲腳本并不一定會(huì)按照順序執(zhí)行片迅,所以最好只包含一個(gè)延遲腳本残邀。
defer屬性只使用于外部的腳本文件,這一點(diǎn)在HTML5中明確規(guī)定柑蛇,因此支持HTML5的實(shí)現(xiàn)會(huì)忽略給嵌入腳本設(shè)置的defer屬性芥挣。所以,把延遲腳本放在頁(yè)面底部仍然是最好的選擇耻台!
異步腳本
HTML5為<script>元素定義了async屬性空免,與defer類(lèi)似,都是用于改變處理腳本的行為盆耽,只適用于外部腳本文件蹋砚,并告訴瀏覽器立即下載文件,與defer不同摄杂,標(biāo)記async的腳本并不保證按照指定的先后順序執(zhí)行坝咐,因此,要確保腳本文件之間互不依賴(lài)析恢。
指定async的目的是不讓頁(yè)面等待腳本下載和執(zhí)行墨坚,從而異步加載頁(yè)面其它內(nèi)容,建議異步腳本不要在加載期間修改DOM
嵌入代碼和外部文件
在HTML中嵌入Javascript代碼雖然沒(méi)有問(wèn)題映挂,但是一般認(rèn)為最好的做法還是盡可能使用外部文件來(lái)包含Javascript代碼泽篮。
引用外部文件盗尸,會(huì)有幾個(gè)有點(diǎn)
1、可維護(hù)性咪辱,
2振劳、可緩存椎组,瀏覽器根據(jù)具體的設(shè)置緩存鏈接的所有外部Javascript文件
3油狂、適應(yīng)未來(lái),