javascript - 我如何尝试从 CDN 加载脚本并回退到镜像?

标签 javascript html css esp8266

我正在 ESP8266 上设置一个简单的网络应用程序。它就像一个魅力。对于 UI,我使用的是 Bootstrap,这是一个相当大的框架。这意味着它在提供 css 文件时有点慢,因为存储不是那么快。

有没有一种方法可以让我在 html 页面(有或没有 JavaScript)上首先尝试从 CDN 获取 Bootstrap ,如果我们没有网络访问权限,则在 ESP 上获取镜像?

我不知道从哪里开始。我还认为使用 JavaScript 很难做到这一点,因为这将在 DOM 准备好后完成。所以在加载后添加样式表,这行不通吗?

有人对如何执行此操作有任何建议吗?

最佳答案

使用 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest请求 css 文件。如果无法加载,请将页面重新加载到不使用任何外部资源的新页面。

编辑添加解释:

首先,没有简单的方法可以检测链接元素是否已完成加载 css 文件或失败。因此,对于您的情况,最简单的方法是按照我提到的那样进行,您执行 XHR,如果文件成功加载,则您可以访问网络,否则您没有。加载 2 次没有问题,一次来自 XHR,另一次来自 link 标签,因为,如果您的脚本先加载它,那么它将为 link 标签缓存,如果 link 标签先加载它,那么它将为 XHR 缓存。所以一切都很好。

在此之后,如果加载失败,您可能希望从其他位置加载它。动态加载 css 是可能的,但我认为最简单的解决方案是加载不同的页面。这样,即使将来你添加更多的资源,更多的 css 文件或一些外部库,你将始终拥有 2 个版本的页面,本地版本和网络版本,并且不会对网络不可用系统进行任何更改.

关于javascript - 我如何尝试从 CDN 加载脚本并回退到镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46918553/

相关文章:

javascript - 每个浏览器 session 弹出一次 cookie

php - HTML 表格转数组 PHP

javascript - 滚动页面时显示/隐藏 DIV

当光标移动到子菜单时,css 顶级菜单不会保持悬停样式

javascript - 如何检测 JavaScript 中的数组相等性?

javascript - Angular 2 eventEmitter 不起作用

javascript - Unicode 值\uXXXX 到 Javascript 中的字符

javascript - 有没有办法在javascript中重新组织以下数组?

html - 使用 CSS 切换 block 元素的顺序

html - 如何减少hr标签的默认边距?