最近 Bootstrap 4 已经正式发布了 , 可能已经有爱尝鲜的小伙伴在 alpha 阶段就尝试过 BS4 。不过今天要说的不是 BS4 , 而是官网里引入 BS4 框架依赖的 jQuery 的代码:
<script src=https://www.isolves.com/it/cxkf/yy/html5/2022-02-01/"https://code.jquery.com/jquery-3.2.1.slim.min.js"integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"crossorigin="anonymous">
看起来比以前的写法复杂好多的样子 。先不着急慢慢看 , 多了一个 integrity 属性 , 看值的样子就知道是用来验证文件完整性的 。另外还有一个 crossorigin 属性……怎么?直接通过 script 标签加载网站外 JS 资源也要开始考虑跨域的问题了吗?
这里不讨论 <script> 的 crossorigin 属性怎么用 , 以及服务器端要怎么支持此属性 , MDN 文档已经说得很清楚 。
不知道大家对此新属性的感觉如何 , 我的第一感觉是:新加了这么一个属性 , 难道以前不用 crossorigin 属性的时候 , 会出什么问题吗?到底可能会出什么问题呢?
从谷歌的结果来看 , 比较一致的说法是 , 当引入跨域的脚本(比如用了 apis.google.com 上的库文件)时 , 如果这个脚本有错误 , 因为浏览器的限制(根本原因是协议的规定) , 是拿不到错误信息的 。当本地尝试使用 window.onerror 去记录脚本的错误时 , 跨域脚本的错误只会返回 Script error 。
文章插图
而 html5 新的规定 , 是可以允许本地获取到跨域脚本的错误信息的 , 但有两个条件:一是跨域脚本的服务器必须通过
Access-Control-Allow-Origin 头信息允许当前域名可以获取错误信息 , 二是网页里的 script 标签也必须指明 src 属性指定的地址是支持跨域的地址 , 也就是 crossorigin 属性 。有了这两个条件 , 就可以获取跨域脚本的错误信息:
文章插图
但事情还是不够明朗 , 看起来跨域脚本报个错也没什么啊 , 为什么浏览器(准确说是 HTTP 协议)这么轴 , 非要规定默认情况页面是不能获取跨域脚本错误信息的呢?
这其实跟网络安全有关 , 不妨举一个例子来说明 。
我们先假设浏览器默认可以将跨域脚本的错误信息返回 。
这个时候我在我的博客里写下如下代码:
<script src=https://www.isolves.com/it/cxkf/yy/html5/2022-02-01/"http://某个银行/会员信息网址">