当CDN加载失败时,为字体添加一个本地CSS回退
Appending a local CSS fallback for font-awesome when the CDN fails to load
我正试图为字体真棒创建一个本地回退,当CDN加载失败时,我在向<head>
元素添加<link>
标签时遇到了一些问题。
预期行为
如果对CDN的GET请求在页面加载时产生200以外的状态,则应在<head>
元素中添加到字体真棒的本地版本的链接。
实际行为
向CDN发出的GET请求失败后,不会向<head>
元素添加指向本地版本的字体真棒的链接。
该问题似乎发生在以xmlHttp.onreadystatechange = function() {
开头的代码块中。
当我将parentElement.insertBefore(createFallback, referenceElement);
移动到xmlHttp.onreadystatechange = function() {
块之外时,到本地回退的链接被添加到<head>
元素中,这很好。但我不明白为什么它不能在代码块中工作。
我希望能够检测CDN是否关闭,如果是,请将链接应用到字体真棒的本地版本。在查看页面时,我没有在控制台中收到任何错误消息,
我的代码如下:
<!doctype html>
<html class="no-js" lang="">
<head>
<link id="fontAwesomeFallback" rel="stylesheet" href="#">
<script>
// Define Variables
var createFallback = document.createElement("link");
createFallback.type = "text/css";
createFallback.rel = "stylesheet";
createFallback.href = "/css/font-awesome.css";
var referenceElement = document.getElementById("fontAwesomeFallback");
var parentElement = referenceElement.parentNode;
// Open Http Request
xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css", true);
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status !== 200) {
parentElement.insertBefore(createFallback, referenceElement);
console.log("Local fallback appended to head element");
}
}
</script>
</head>
<body>
</body>
</html>
我真的很感激你们能提供的任何帮助!
谢谢!
答案在https://stackoverflow.com/a/27404688/294577。
但是,如果您使用jQuery库,我建议使用以下代码来最大限度地减少布局回流。
<div id="FontAwesome_fallback" style="display:none"></div>
<script async>(function($) {
var $span = $('<span class="fa" style="display:none"></span>');
$('#FontAwesome_fallback').append($span)
var f = $span.css('fontFamily');
if (f !== 'FontAwesome') {
$('head').append('<link href="/css/font-awesome.css" rel="stylesheet">');
}
})(jQuery);
</script>
不必担心createDocumentFragment
,因为它在http://quirksmode.org/dom/core/#miscellaneous
您也可以通过以下方式瞄准文档主体,只需使用JavaScript即可完成这一切:
<script async>(function($){
var $span = $('<span class="fa" style="display:none">`</span>').appendTo('body');
if ($span.css('fontFamily') !== 'FontAwesome' ) {
$('head').append('<link href="~/assets/shared/css/vendor/font-awesome-4.7.0.min.css" rel="stylesheet">');
}
$span.remove();
})(window.jQuery);
</script>
- 什么是HTML5画布标记的回退
- 如何在XHTML中添加jQuery CDN回退
- 当CDN加载失败时,为字体添加一个本地CSS回退
- 与 promise 一起使用时,异步瀑布不执行下一个回调方法
- HTML5 视频的回退图像
- Angular,设置一个回调函数,用于在工厂和控制器之间更新
- 同时使用回退和 JavaScript.什么是正确的方法
- Javascript “替换”替换回退
- 使用 CoffeeScript 的类和 jquery.transit 创建一个回调循环
- 如何通过一个回调异步排队和执行多个promise
- jQuery CDN超时回退
- 悬停状态指针事件:无Javascript回退
- IE8 内联尝试的 SVG 回退
- 带有一个回调的多个循环ajax请求
- 设置计时器以等待为flash回退视频播放器加载swfobject脚本
- 如何为未加载、加载时间过长和被阻止的css文件编写回退
- 现代化与仅为CSS中的前缀提供回退.哪一个,为什么
- 我可以在JavaScript中定义一个“回退”方法吗?
- 我如何使用Javascript创建一个回退iframe
- 引导-当有一个图像加载错误时回退