前言
JavaScript是浏覽器的内置腳本語言。當網頁中嵌入了JavaScript腳本,浏覽器加載網頁時,就會執行腳本,進而操作浏覽器,實作各種動态效果
JavaScript代碼嵌入網頁的方法
1、 <script>
元素直接嵌入代碼
<script>
<script type="text/javascript">
function sayHello() {
alert("hello!");
}
</script>
2、 <script>
元素加載外部腳本
<script>
<script type="text/javascript" src="example.js"></script>
<script>
标簽相關屬性
<script>
type屬性
-
标簽預設就是JavaScript代碼,嵌入javascript腳本時,type屬性可以省略<script>
- 如果type屬性的值,浏覽器不認識,就不會執行其中的代碼,是以可以在
标簽中嵌入任意的文本内容,隻要加上一個浏覽器不認識的type屬性就行,浏覽器不會執行也不會顯示它的内容,但是這個<script>
節點依然存在于DOM之中,可以使用<script>
節點的text屬性讀取它的内容<script>
defer屬性
<script src="a.js" defer></script>
<script src="b.js" defer></script>
defer屬性的運作流程:
- 浏覽器開始解析HTML網頁
- 解析過程中,發現帶有defer屬性的
元素<script>
- 浏覽器繼續往下解析HTML網頁,同時并行下載下傳
元素加載的外部腳本<script>
- 浏覽器完成解析HTML網頁,此時再回過頭執行已經下載下傳完成的腳本
需要注意:
- 異步加載資源
- 按照順序執行腳本
- 使用defer加載的外部腳本不應該使用document.write方法
async屬性
<script src="a.js" async></script>
<script src="b.js" async></script>
async屬性的運作流程:
- 解析過程中,發現帶有async屬性的
标簽<script>
-
标簽中的外部腳本<script>
- 腳本下載下傳完成,浏覽器暫停解析HTML網頁,開始執行下載下傳的腳本
- 腳本執行完畢,浏覽器恢複解析HTML網頁
- 并不會按照順序執行JS,誰先下載下傳完,誰就先執行
- 使用async加載的外部腳本不應該使用document.write方法
async和defer屬性歸納
- 都能解決“阻塞效應”
- 都是異步加載資源,但執行順序不一樣
- 如果腳本之間沒有依賴關系,就使用async屬性,如果腳本之間有依賴關系,就使用defer屬性
動态生成腳本
['a.js', 'b.js'].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
- 不會阻塞頁面渲染
- async設定為false可以保證b.js在a.js後面執行
- 在這段代碼後面加載的腳本檔案,會等在b.ja執行完成後再執行
相關知識點總結
- 包含在
标簽内部的JavaScript代碼,将被從上到下一次解析<script>
- 無論以哪種方式嵌入代碼,隻要不存在defer和async屬性,浏覽器都會按照
标簽在頁面中出現的先後順序對它們進行解析<Script>
- 加載外部腳本的優點:可維護性、可緩存、适應未來
-
放在底部的原因1、避免“阻塞效應”。2、避免,在DOM結構生成之前調用DOM節點,而産生錯誤<script>