已经有一个类似的问题,但我觉得它没有很好地回答我的问题。
我想要检查外部样式表是否已经加载。例如,如果由于网络问题而阻塞,则我想要知道并加载备用方案。这是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
如果有人能帮我找到如何检查样式表是否已经加载的方法,那将非常有帮助并且感激不尽。