【发布时间】:2014-01-14 10:59:47
【问题描述】:
我正在尝试使用 javascript 为字体提供本地回退 - 我不能使用 jQuery,因为它还没有加载,如果可能的话我不想加载像 yepnope 这样的另一个库(加上检查yepnope 中的样式表现在已弃用)。
我没有找到太多关于这类事情的参考资料,而且我不知道任何 javascript,所以我可能使用了错误的搜索词 - 如果这很简单,抱歉。
到目前为止我有:
<!-- load fonts from cdn -->
<link href="//fonts.googleapis.com/css?family=Flamenco" rel="stylesheet" type="text/css">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet" type="text/css">
<!-- check fonts loaded via cdn and provide local fallbacks -->
<script>
function fontLoaded(href) {
var fontFound = false;
for (var i = 0; i < document.styleSheets.length; i++) {
var sheet = document.styleSheets[i];
if (
sheet['href'] == "//fonts.googleapis.com/css?family=Flamenco" &&
sheet['href'] == "//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css"
) {
fontFound = true;
}
};
return fontFound;
}
if (!fontLoaded('font-awesome.css')) {
local_fallback = new CustomEvent('link');
local_fallback.setAttribute("rel", "stylesheet");
local_fallback.setAttribute("href", "/assets/css/fonts.css");
document.getElementsByTagName("head")[0].appendChild(local_fallback);
}
</script>
不用说,它不起作用 - 问题:
我在 Firebug 中看到“TypeError: local_fallback.setAttribute is not a function”,所以怀疑这就是替代 font.css 文件未加载的原因 - 对吗?
我使用的是 '//' 而不是 'http://' 和 'https//' 这是否适用于 javascript?
我不确定如何检查 Google 字体是否未加载
(if (!fontLoaded('font-awesome.css'))),因为 Google 不会加载像 font awesome 这样的特定 css 文件 - 但我认为只检查 fontawesome 是可以的,因为检查两个样式表时的 && 运算符?
我也找到了这个选项,但字体很棒:
<script>
function loadLocalFonts () {
var fonts = document.styleSheets;
for (var i = 0, max = fonts.length; i < max; i++) {
if (fonts[i].href == "//fonts.googleapis.com/css?family=Flamenco" && "//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css")
return;
}
var link = document.createElement("link");
link.rel = "stylesheet";
link.href = "/assets/css/fonts.css";
document.getElementsByTagName("head")[0].appendChild(link);
}
loadLocalFonts();
</script>
任何指向正确方向的指针将不胜感激。
【问题讨论】:
-
为什么不简单地使用onload事件呢? Stylesheet load events
-
感谢@Givi 的链接,它看起来既漂亮又简单——但该页面还声明它是 HTML5 候选推荐,W3C as of Aug 2013 也是如此。看起来样式表加载和错误事件特别不受广泛支持或有问题?有没有办法通过修改我发布的一个例子来做到这一点,还是我离题了?
-
好的,看起来最后一个代码示例实际上正在运行,问题是 FontAwesome 不会在 Chrome 或 Firefox 中显示(我使用直接本地链接标签来测试本地加载) - Safari 工作正常,我可以看到 FontAwesome 作为资源加载。我已经尝试了 .htaccess for Firefox 位,我是从同一个域本地加载的,所以我确定这不是问题 - 有没有其他人在 Firefox 和 Chrome 中看到过这个?
-
澄清:Fontawesome 实际上是在 Firefox 中加载,只是没有显示。
-
已经尝试了通常的 .htaccess Firefox 修复,但在这个 sinatnce 中,字体是从同一服务器 (MAMP) 加载的,所以没有区别。
标签: javascript fonts font-awesome