<script>元素
在HTML中使用<script>元素来插入JavaScript是网景公司创造出来的,后来该元素被正式加入HTML规范
<script>元素的8个属性:
async:可选。表示应该立即开始下载脚本,但不能阻止其他页面动作,只对外部脚本文件有效。
charset:可选。使用 src 属性指定的代码字符集。这个属性很少使用,因为大多数浏览器不在乎它的值。
crossorigin:可选。配置相关请求的CORS(跨源资源共享)设置。默认不使用CORS。crossorigin="anonymous"配置文件请求不必设置凭据标志。crossorigin="use-credentials"设置凭据标志,意味着出站请求会包含凭据。
defer:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效。
integrity:可选。允许比对接收到的资源和指定的加密签名以验证子资源完整性(SRI,Subresource Integrity)。如果接收到的资源的签名与这个属性指定的签名不匹配,则页面会报错,脚本不会执行。这个属性可以用于确保内容分发网络(CDN,Content Delivery Network)不会提供恶意内容。
language:废弃。最初用于表示代码块中的脚本语言(如"JavaScript"、"JavaScript 1.2"或"VBScript")。大多数浏览器都会忽略这个属性,不应该再使用它。
src:可选。表示包含要执行的代码的外部文件。
type:可选。代替 language,表示代码块中脚本语言的内容类型(也称 MIME 类型)。按照惯例,这个值始终是"text/javascript",尽管"text/javascript"和"text/ecmascript"都已经废弃了。JavaScript 文件的 MIME 类型通常是"application/x-javascript",不过给type 属性这个值有可能导致脚本被忽略。在非 IE 的浏览器中有效的其他值还有"application/javascript"和"application/ecmascript"。如果这个值是 module,则代码会被当成 ES6 模块,而且只有这时候代码中才能出现 import 和 export 关键字。
使用<script>的两种方式:
直接嵌入JavaScript代码
作为外部js文件引用的入口
注意:
两种方式不能同时使用
src属性可以发送一个get请求,并不受同源策略的限制,也就是能正常返回js文件,但是返回的JavaScript会受到页面限制和http/https限制。因此需要谨慎引用第三方js文件,避免执行恶意代码
在HTML中嵌入的代码,按照<script>的顺序依次执行
加载时机问题:
早期放在<head>中,便于同css等外部文件利于管理,网页会将head内引入的外部文件先下载、解析和解释完成后,等到触发到body标签才开始渲染,因此如果引入的外部js文件太多会导致页面白屏。为了解决这个问题,现代web应用程序将<script>放到了body标签内。
推迟执行的脚本和异步脚本:
虽然按照HTML描述的<script>标签的执行顺序来说,JavaScript应是按顺序执行,但是可以通过<script>标签的属性(defer和async)来推迟或异步执行脚本
推迟执行:脚本会在页面全部解析完后再执行,但是会立即下载,只是执行时机推迟
异步执行:不必等脚本下载和执行完后再加载页面,同样也不必等到该异步脚本下载和执行后再加载其他脚本,async属性让加载的脚本丧失了和其他元素的依赖性,包括其他<script>
动态加载脚本:
由于HTML通过嵌入<script>标签加载js文件,同时js又可以通过DOM API操作HTML,因此js可以动态的通过添加<script>来加载js文件
默认情况下,通过这种方式加载的<script>是异步加载的,相当于添加了async属性,但是不是所有浏览器都支持async属性,因此要统一动态脚本的加载行为就要将async属性设置为false
这种方式会影响脚本在资源获取队列中的优先级
行内代码于外部文件
为了提高可维护性,同时考虑浏览器缓存文件通用性,最佳实践是使用外部文件的方式存放js代码
文档模式
IE5.5发明了文档模式的概念,并通过doctype来切换文档模式,文档模式有三种(最初只有前两种):混杂模式、标准模式、准标准模式
区别:混杂不使用doctype指定,准标准模式没有标准模式严格,主要体现在图片周围的空白,表格尤为明显
<noscript>元素
<noscript>出现是为了解决早期浏览器不支持JavaScript的问题,它不是为了隐藏脚本,反而是为了在不支持脚本的浏览器中显示HTML元素(<script>除外)
评论区