HTML中的JavaScript

324 阅读3分钟

阅读《JavaScript高级程序设计(第4版)》第二章及视频讲解

script

src

  • 没有这个属性,表示包含行内js代码

  • 有这个属性,用于指定要加载的外部js

type

  • 在浏览器中,值始终是text/javascript
  • 如果值为module,则代码会被当做ES6模块
  • 如果值为nomodule,兼容不支持ES6的浏览器,主要是IE11

crossorigin

  • 配置相关请求的CORS(跨域资源共享)设置。

  • 基本概念

    可以请求外部资源的标签:script,link,img,oudio,video

    域的三部分:协议,域名,端口号

    凭据:cookies,证书,用户名密码等

  • 跨域请求(CORS)设置凭据模式

    corssorigin="anonymous" 默认,表示不包含凭据

    corssorigin="user-credentials", 表示包含凭据

integrity

  • 确认引用外部资源(CDN等)不会存在恶意内容。

  • integrity=“散列值算法-散列值(Base64编码)”

    <script integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" ></script>
    
  • 浏览器在加载带有integrity属相的script和link时,在加载完文件后,会先比较自己计算的散列值与integrity属性的值,如果不相等,则返回网络错误。

脚本加载时间

绿色表示HTML文本解析器时间,蓝色表示获取资源时间,红色色表示代码执行时间

默认

  • 碰见script标签后停止解析,进行资源获取,获取完成立即执行脚本,继续解析
  • 会中断HTML文本解析,中断包括获取和执行
  • script一般放在底部,之前

defer 推迟

  • 碰见script标签后,异步进行资源获取,不会中断解析,等HTML文本解析完成后,执行脚本
  • 在DOMContentLoaded事件之前执行

async 异步

  • 碰见script标签后,异步进行资源获取,不会中断解析,获取资源完成后中断解析,立即执行脚本,继续解析
  • 一般不会操作文档,不依赖文档
  • 在load事件之前执行,可能在DOMContentLoaded之前或之后

type="module"

  • 默认 defer 模式
  • 从入口文件开始,异步加载所有的依赖,等待文档解析结束后执行

type="module" async

  • async模式
  • 从入口文件开始,异步加载所有的依赖,中断解析,执行脚本,继续解析

跨域获取资源的原理

script 元素一个最为强大、同时也备受争议的特性是,它可以包含来自外部域的JavaScript文件。同时拥有此功能的有script,link,img,oudio,video。src属性可以是一个完整的url。而且这个url指向的资源可以根包含它的HTML页面不在同一个域中。

浏览器在解析这个资源时,会向src属性指定的路径发送一个get请求,以取得相应的资源。这个初始的请求不受浏览器同源策略限制,但返回并被执行的JavaScript则受限制。当然这个请求仍然受到父页面HTTP/HTTPS协议限制。

来自外部的代码会被当成加载它的页面的一部分来加载和解释。