【发布时间】:2013-07-16 01:54:23
【问题描述】:
有一个similar post already,但我觉得它不能很好地回答我的特定问题。
我想检查外部样式表是否已加载。例如,如果它受到网络问题的阻碍,那么我想知道并加载一个后备。这是作为 jQuery 主题 CSS 的 CDN 的后备方案 但我希望这最终不会专门针对那个,因为我有其他我想应用的外部 CSS这个也是。
- 引用
link元素将出现在页面上,因此无法接受头部中是否存在链接元素的模式匹配。 - 我没有能力更改样式表中的 CSS,所以添加虚拟 CSS 是不可接受的。
- 由于我无法控制外部样式表中的 CSS,因此依赖 CSS 中的现有类是脆弱的,所以如果有其他解决方案,我更愿意。
- 是使用超时的唯一方法吗?我应该设置多长时间?我应该选择什么事件来测量时间?
- 我更喜欢纯 javascript,然后是 jQuery,但其他 javascript 框架的答案将被接受,因为它们无疑会对某人有所帮助。
编辑:一个新的想法。如果样式表是通过 AJAX 加载的,并且检查了状态码会怎样?这是一个可行的选择吗,有人知道吗?
这是我目前拥有的脚本:
<script type="text/javascript">
var cdn = 'http://code.jquery.com/ui/1.10.1/themes/black-tie/jquery-ui.min.css';
var ss = document.styleSheets;
for (var i = 0, max = ss.length; i < max; i++) {
var sheet = ss[i];
var rules = sheet.rules ? sheet.rules : sheet.cssRules;
if (sheet.href == cdn) {
if ( rules == null || rules.length == 0) {
var link = document.createElement("link");
link.rel = "stylesheet";
link.href = '/js/jquery-ui/1.10.1/themes/black-tie/jquery-ui.min.css';
document.getElementsByTagName("head")[0].appendChild(link);
}
break;
}
}
</script>
我在使用控制台 (Chrome v25.0.1364.172) 时发现,即使样式表已从 CDN 加载,document.styleSheets[x].rules 也是 null。我不确定我是否在控制台中正确访问它,也许还有另一个我应该使用或反对的功能?
CSSStyleSheet {rules: null, cssRules: null, ownerRule: null, media: MediaList, title: null…}
cssRules: null
disabled: false
href: "http://code.jquery.com/ui/1.10.1/themes/black-tie/jquery-ui.min.css"
media: MediaList
ownerNode: link
ownerRule: null
parentStyleSheet: null
rules: null
title: null
type: "text/css"
__proto__: CSSStyleSheet
如果有人能帮我找到如何检查样式表是否已加载,那将非常有帮助,非常感谢。
【问题讨论】:
-
好吧,在您的情况下,您想知道工作表是否实际加载,而您链接到的帖子只是处理在标题中放置一个 (如果一个尚不存在)。不幸的是,如果 元素已完成加载,即使您通过 JS 创建它,也无法通过 Javascript 检查。我确实想出了这个:blog.rjzaworski.com/2011/08/… 这有点骇人听闻,但简而言之,它涉及在页面上放置一个元素,一旦加载 CSS,其属性就会改变,然后每隔一段时间检查它。
-
@Brian 谢谢你,这是一个有趣的方法。我认为您应该将此添加为答案,以便我(和其他人)至少可以为您提供一些帮助。你太谦虚了:)
-
这不是一个完整的解决方案,因为实际上没有任何方法可以知道 CSS 何时完成加载到浏览器。所以你必须设置一个有点随意的“超时”时间,然后你决定使用你的后备 CSS。无论如何,这类问题通常通过负载均衡器和 CDN 来处理,而不是通过前端的 JS 代码来处理。我认为我在这里所做的贡献不足以提供作为“答案”本身的“答案”,而只是您可能希望使用 JS 代码解决这个问题的大方向;)
-
@Brian 我终于让它工作了,使用了你博客文章中想法的一个版本。非常感谢,我真的很感激。
标签: javascript jquery css