JavaScript高级程序设计最新一版(第四版)笔记,持续更新中 本笔记只记录重点、难点、新点
第2章 HTML中的JavaScript
2.1 script
标签
<script>
标签的8个属性
attribute | status | describe |
---|---|---|
async | 可选,只对外部脚本文件有效 | 和其他资源一起异步加载 |
charset | 不建议用,大部分浏览器会忽视该值 | 使用scr属性时指定代码字符集 |
crossorigin | 可选,默认不实用 | 配置相关请求的CORS,值为anonymous 和use-credentials |
defer | 可选,只对外部脚本文件有效 | 文档解析和显示完成后再加载 |
integrity | 可选 | 验证子资源完整性,可用于检验CDN所得内容 |
language | 废弃 | 指定脚本语言 |
scr | 可选 | 包含外部脚本文件 |
type | 可选 | 一般用于模块引入type="module" |
-
<script>
元素中的代码被计算完成之前,页面的其余内容不会被加载,也不会被显示。 -
<script></script>
必须成对,单独的<script src="example.js" />
是无效的 -
在
<script src="example.js">...code....</script>
中,code代码会被忽略 -
对于src中的资源,浏览器会使用GET请求 来获取其指定资源
-
若无
defer
和async
属性,浏览器会按照<script>
出现位置顺序加载它们。 -
现代Web应用程序通常将
JavaScript
引用放在<body>
元素中的页面内容后面。 -
defer
属性开启后脚本会在整个页面解析后在加载,一般只在一个脚本开启defer
,因为实际应用中多个开启defer
属性的脚本会乱序加载。 -
async
属性开启后会和页面解析一同加载,开启async
属性的脚本也成为异步脚本,多个异步脚本也会乱序加载,因此异步脚本之间不能有依赖关系,并且异步脚本加载期间不能修改DOM -
动态加载脚本过程中 是以异步方式加载的:
<script>
let script = document.createElement('script')
script.src = './print.js'
document.head.append(script)
</script>
由于不是所有浏览器都支持async
属性,为了统一动态脚本加载,可以将其设置为同步加载
<link rel="preload" href="./print.js" as="script">
<script>
let script = document.createElement('script')
script.src = './print.js'
script.async = false
document.head.append(script)
</script>
引入
<link rel="preload" href="./print.js" as="script">
是为了让浏览器预加载器知道有这么一个资源要加载,不然动态脚本加载对预加载器是不可见的,就会影响到该资源在资源获取队列的优先级,进而影响性能。
2.2 行内代码与外部文件
- 最佳实践:JavaScript代码由外部引入
主要的理由有:
- 便于维护
- 便于缓冲,当有两个网页需要同一js文件时,浏览器在前一网站缓存的该js文件就能直接给后一网站了