<分区>
<分区>
我正在尝试为我的 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>
他们的本地对应标签。
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
(用于外部 样式表名称和本地 样式表名称之间的键值关系)。
<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" (..) >
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" (..) >
<link>
如果它的响应状态是0(不允许)或404(未找到),这将失败,这意味着如果样式表在线但它的服务器没有Access-Control-Allow-Origin="*"
政策它也会认为它失败了。 (幸运的是,大多数 cdn 都有它,包括您的)。document.styleSheets.cssRules
在外部样式表中返回 null
在 Chrome 和 Firefox 中只会直接向您抛出安全错误。希望对您有所帮助! :)
关于javascript - 如何为未加载、加载时间过长和阻塞的 css 文件编写回退?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28521235/
相关文章:
javascript - 有什么方法可以将 ' important' 赋予 Controller 中的 css 属性
google-cloud-platform - 如何检查最新的 Cloud Run 修订版是否已准备好提供服务
javascript - 自动化测试 performTaskWithPathArgumentsTimeout 在命令行中不起作用?
javascript - .live() 在 JQuery 1.4.4 中不起作用
css - asp.net mvc 5 - StyleBundle CdnFallbackExpression 问题?
javascript - 如何更改结果在此字符分类器代码中的显示方式?