向HTML頁面中插入JavaScript腳本的主要方法有三種:
- 頁面嵌入<script>標簽內聯(lián)
- 頁面嵌入<script>標簽外聯(lián)
- 直接在HTML元素中加入
嵌入<script>標簽內聯(lián)
<script type="text/javascript">
function sayHi() {
alert("hi");
}
</script>
當瀏覽器執(zhí)行到上述<script>標簽時估脆,會暫停頁面其他部分的加載拂盯。
在使用<script>嵌入JavaScript代碼時妈倔,不要在代碼中的任何地方出現(xiàn)"</script>"字符串定枷,會被認為是代碼結束的標志:
<script type="text/javascript">
function sayScript() {
alert("</script>");//錯誤
}
sayScript();
</script>
但是可以將它分成兩部分扔涧,如:
<script type="text/javascript">
function sayScript() {
alert("<\/script>");//或alert('<'+'/script>');alert('</'+'script>');等
}
sayScript();
</script>
頁面嵌入<script>標簽外聯(lián)
此時需要指定src
屬性:
<script type="text/javascript" src="somename.js"></script>
可以是來自本地的js文件,也可以是外部域中的:
<script type="text/javascript" src="http://www.somewhere.com/somefile/somename.js"></script>
當src指定外部js文件地址后谤辜,<script>標簽內部就不應再包含額外腳本垄提。即使包含了額外的腳本,也會被忽略烈和。
<script>元素的屬性
async
屬性:可選爱只。表示應該立即下載腳本,但不應妨礙頁面中的其他操作招刹,比如下載其他資源或者等待加載其他腳本恬试。只對外部腳本有效。
charset
屬性:可選疯暑。表示通過src屬性指定的代碼的字符集训柴。
defer
屬性:可選。表示腳本可以延遲到文檔完全被解析和顯示之后再執(zhí)行妇拯。只對外部腳本有效幻馁。
language
屬性:已廢棄洗鸵,原來用于表示編寫代碼使用的腳本語言(如JavaScript、JvavScript1.2等)仗嗦。大多數(shù)瀏覽器都會忽略這個屬性膘滨,因此也木有必要用了。
src
屬性:可選稀拐。表示包含要執(zhí)行代碼的外部文件火邓。
type
屬性:可選〉虑耍可以看成是language屬性的替代屬性铲咨;表示編寫代碼使用的腳本語言的內容類型。雖然text/javascript和text/ecmascript都已經不被推薦使用蜓洪,但是考慮到瀏覽器兼容等鸣驱,目前type的值依然可以是text/javascript。但并非是必須的蝠咆。
無論是內聯(lián)還是外聯(lián)腳本,只要不存在defer和async屬性北滥,瀏覽器都會按照<script>出現(xiàn)的先后順序對它們依次進行解析刚操。
直接在HTML元素中加入
<button type="submit" onclick="alert('clicked me')">提交</button>
<script>標簽的位置
按照慣例,<script>元素應該放在頁面的<head>元素中再芋,和<link>位置類似菊霜,這樣做的目的就是把所有的外部文件(CSS和JavaScript)都放在同樣的位置。但是這樣會導致頁面內容出現(xiàn)延遲济赎。所以一般<script>標簽都放在<body>元素中內容的最后也就是</body>之前鉴逞。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>test</title>
<link rel="stylesheet" href="index.css">
</head>
<body>
<p>This is a para.</p>
<button type="submit">提交</button>
<script src="index.js" type="text/javascript"></script>
</body>
</html>
延遲腳本
既然有defer
屬性的存在,那么就可以把<script>元素放在頁面的<head>標簽內司训,相當于提醒瀏覽器立即下載但是延遲執(zhí)行构捡。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>test</title>
<link rel="stylesheet" href="index.css">
<script src="index.js" type="text/javascript" defer="defer"></script>
</head>
<body>
<p>This is a para.</p>
<button type="submit">提交</button>
</body>
</html>
而當有兩個腳本都設置了defer="defer"
時,HTML5規(guī)范規(guī)定了第一個腳本會比第二個腳本先執(zhí)行壳猜,但是實際上延遲腳本并不一定會按照順序執(zhí)行勾徽,因此最好只包含一個延遲腳本。
異步腳本
與defer
類似统扳,async
只適用于外部腳本文件喘帚,并告訴瀏覽器立即下載文件。但是與defer
不同的是咒钟,標記為async
的腳本并不保證按照指定執(zhí)行順序執(zhí)行吹由。