javascript - 如何为未加载、加载时间过长和阻塞的 css 文件编写回退?

标签 javascript css cdn conditional-statements fallback

<分区>

我正在尝试为我的 css 文件编写条件语句,因为我希望将它们托管在 CDN 上。无论如何,我需要为它写一个回退,这样如果 CDN 遇到可能的停机,我可以立即在我自己的服务器上运行该文件。问题是我对编写 javascript 的知识仍然是初学者,因此我不知道如何编写脚本。

有人可以帮我解决这个问题吗?

下面这段代码是我希望用在CDN上的:

<link rel="stylesheet" type="text/css" href="http://cdn.jsdelivr.net/animatecss/3.2.0/animate.min.css">

请教我如何正确创建此条件函数?

最佳答案

免责声明

似乎所有这些非常善良的人都将您的问题标记为重复,但是他们没有注意到为该问题提供的答案不起作用(答案来自 2011 看在上帝的份上,看看为什么它在注释中不起作用)。我已经将它标记给版主,看看他们是否可以取消标记。

无论如何,我已经创建了一个 new demo对于我更新的答案,考虑到您需要检查多个 cdn css 文件以及这可能如何影响您的网站性能。 (我在 head 中使用了 XMLHttpRequest() 方法,根据 this cool guy 速度更快,因为它不检索页面正文。

我还提供了一种格式来轻松替换失败的外部 <link>他们的本地对应标签。

JavaScript

CSSback = {
    local: "cssfallback/",
    fallbacks: {
        "animate.min.css": "localanimate.css",
        "nonexistent.min.css": "localnonexistent.css"
    }
}

CSSback.init = function () {
    var links = document.head.querySelectorAll("link");
    for (var i = 0, l = links.length; i < l; i++) {
        var link = links[i];
        this.ping(link);
    }
}.bind(CSSback);

CSSback.ping = function (link) {
    var url = link.href;
    var http = new XMLHttpRequest();
    http.onreadystatechange = function () {
        if (http.readyState == 4 && http.status != 200) this.fallback(link);
    }.bind(this);
    http.open("head", url, true);
    http.send();
}.bind(CSSback);

CSSback.fallback = function (link) {
    var url = link.href.split("/");
    var name = url[url.length - 1];
    var fallback = this.fallbacks[name];
    if (fallback) {
        link.parentNode.removeChild(link);
        var link = document.createElement("link");
        link.rel = "stylesheet";
        link.type = "text/css";
        link.href = this.local + fallback;
        document.head.appendChild(link);
    }
}.bind(CSSback);

window.addEventListener("load", CSSback.init);

用法

您应该修改 CSSBack{}local (用于本地样式表的路径)和 fallbacks (用于外部 样式表名称和本地 样式表名称之间的键值关系)。

HTML

<link href="http://cdn.jsdelivr.net/animatecss/3.2.0/animate.min.css" (..) >
<link href="http://cdn.jsdelivr.net/animatecss/3.2.0/nonexistent.min.css" (..) >

修改后的 JavaScript

CSSback = {
    local: "cssfallback/",
    fallbacks: {
        "animate.min.css": "localanimate.css",
        "nonexistent.min.css": "localnonexistent.css"
    }
}

如果有<link>失败,它将删除它并用它的本地对应物替换它,在本例中为 nonexistent.min.css将失败,它将被替换,留下最后的 <link>标签是:

<link href="http://cdn.jsdelivr.net/animatecss/3.2.0/animate.min.css" (..) >
<link href="cssfallback/nonexistent.css" (..) >

注意事项

  • A <link>如果它的响应状态是0(不允许)或404(未找到),这将失败,这意味着如果样式表在线但它的服务器没有Access-Control-Allow-Origin="*"政策它也会认为它失败了。 (幸运的是,大多数 cdn 都有它,包括您的)。
  • 在另一个问题中选择的答案无效,因为 document.styleSheets.cssRules在外部样式表中返回 null在 Chrome 和 Firefox 中只会直接向您抛出安全错误。

希望对您有所帮助! :)

关于javascript - 如何为未加载、加载时间过长和阻塞的 css 文件编写回退?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28521235/

上一篇:javascript - 如何在页面滚动时保持克隆的表头不变

下一篇:html - 将居中的 Div 与紧靠右侧的 Div 对齐

相关文章:

javascript - 有什么方法可以将 ' important' 赋予 Controller 中的 css 属性

css - 在另一个域上托管的 Web 字体

google-cloud-platform - 如何检查最新的 Cloud Run 修订版是否已准备好提供服务

javascript - 自动化测试 performTaskWithPathArgumentsTimeout 在命令行中不起作用?

javascript - .live() 在 JQuery 1.4.4 中不起作用

javascript - 按键后如何删除背景图像?

css - asp.net mvc 5 - StyleBundle CdnFallbackExpression 问题?

javascript - 如何更改结果在此字符分类器代码中的显示方式?

javascript - 显示一个 div 并保持它显示()如果我点击它

javascript - 去除div中的空行