<script>元素
这个元素是由网景公司创造出来,并最早在Netscape Navigator2中实现的。后来这个元素被正式加入到HTML规范
属性
async
可选、只对外部脚本有效
立即开始下载脚本,但不能阻止其它页面动作,比如下载资源或等待其它脚本加载
charset
可选、只对外部脚本有效
指定src代码的字符集,很少使用因为大部分浏览器不在乎它的值
crossorigin
可选、在跨域时是否携带凭据
anonymous:不携带凭据(默认)
use-credentials:携带凭据
凭据:cookie、TLS/SSL证书、HTTP Authentications(HTTP认证)
defer
可选、外部脚本有效、IE7及更早行内脚本有效
在文档解析何显示完成后再执行脚本
integrity
可选
允许对比接收到的资源和指定的加密签名以验证子资源的完整性(SRI,Subresource Intergrity)。如果接收到的资源的签名和这个属性指定的签名不匹配,则页面会报错,脚本不会执行。可以确保内容分发网络(CDN)不会提供恶意内容
language
弃用
最初用于表示代码块中的脚本语言类型版本
src
可选
要执行的外部文件
type
可选
用于代替language,表示代码块中脚本语言的内容类型(
[MIME类型] MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式
)
惯例:按照惯例这个值都是“text/javascript”,尽管“text/javascript”和“text/ecmascript”都已经弃用
通常:JavaScript文件的MIME类型是“application/x-javascript”,不过给这个值有可能导致脚本被忽略
module:代码会被当成SE6模块,而且只有这个时候才能在代码中出现import和export关键字
注意
-
在使用行内js代码时,代码中不能出现
<scirpt> function asyScript(){ console.log("</scirpt>"); // 浏览器解析行内脚本的方式决定了它在看到字符串</scirpt>时,会将其当成结束的</scirpt> // 想要避免这个问题,转义“\”即可,</scirpt> } </scirpt>
-
在XHTML中可以标签自闭合<scirpt />,但不能在HTML中使用
-
按照惯例,外部js文件的扩展名是.js,但这不是必须的,因为浏览器不会检查扩展名。如果不打算使用.js扩展名,一定要确保服务器能返回正确的MIME类型
-
在没有使用defer和async属性时,浏览器会根据script标签在页面中出现的顺序来依次解释它们
-
使用了scr属性的script标签,浏览器只会下载执行脚本,从而忽略行内代码
-
scr属性可以发起跨域get请求,不受浏览器同源策略的限制。当然这个请求仍然受父页面的HTTP/HTTPS协议的限制
位置
现代Web应用程序通常将,js放在元素中页面后面。因为<script>标签的渲染要经过下载、解析、解释才算渲染完成,后续的标签才能被渲染
推迟执行
HTML4.01为<script>元素定义了defer属性,该属性只对外部脚本文件有效。js代码的执行会在解析<\html>后执行
<script defer src="main.js"></script>
<script defer src="main1.js"></script>
HTML5规范要求defer属性的js代码按照它们出现的顺序执行,因此main应先于main1执行,而且两者都会在DOMContentLoaded事件之前执行。但在实际中,defer脚本的执行不一定总按出现顺序执行或在DOMContentLoaded事件之前执行,因此最好只包含一个defer脚本
异步执行
HTML5定义了async属性,告诉浏览器不必等脚本下载和执行完毕后再加载页面,所以多个async脚本并不保证按照它们出现的顺序执行,因此异步脚本不应该在加载期间修改DOM。
异步脚本保证在页面的load事件前执行,但可能在DOMContentLoaded之前或之后执行
动态加载
通过js创建<script>元素并动态设置src属性,在将其添加到页面DOM后才会下载、解析、解析。需要注意的是,js创建的节点默认设置了async属性,需将其属性设置为false
通过上述方法获取资源,对浏览器预加载器是不可见的,会严重影响它们在资源队列中的优先级,可能会严重影响性能。想让预加载器知道这些动态请求文件的存在,可以在文档头部显示的声明它们
<link rel="preload" href="main.js">
缓存
浏览器会根据特定的设置缓存所有外部链接的js文件,如果多个页面用到同一个文件,则该文件只需下载一次
<noscript>元素
针对早期浏览器不支持Javascript的问题,需要一个页面优雅降级的处理方案。最终,元素出现,被用于给不支持JavaScript的浏览器提供代替内容。当浏览器不支持脚本或浏览器对脚本的支持被关闭,包含在<noscript>中的内容就会被渲染,否则不会<noscript>中的内容
文档模式
IE5.5发明了文档模式的概念,即可以使用doctype切换文档模式
混杂模式
让IE像IE5一样支持一些非标准的特性
标准模式
让IE具有兼容标准的行为
准标准模式
浏览器支持很多标准的特性,但是没有标准规定得那么严格