在正确的时间加载缓存的字体
loading cached fonts at the right time
我有一些网络字体是通过 Webfontloader 加载的,就像这样...
<script src="//ajax.googleapis.com/ajax/libs/webfont/1.5.10/webfont.js"></script>
<script>
WebFont.load({
custom: {
families: ['BlenderProBook', 'BlenderProMedium']
}
});
</script>
第一次加载页面时效果很好...问题是,刷新页面时它只在 html 请求时检索缓存的字体,而不是在我的 ReactJS 应用程序运行之前(当 Webfontloader 通常得到它们)。这对我来说太晚了,因为我在预生成的 SVG 中使用它们。
有没有办法强制它每次都获取未缓存的字体?或者更好的是,在正确的时间加载缓存的字体。
我找到了一个解决方案,如果没有其他人可以提供更好的解决方案,我会把它作为我的答案。
我的字体在应用程序中被广泛用于计算文本宽度和布局...(这就是为什么它需要在应用程序运行之前加载),所以我决定使用文本宽度代码作为测试以阻止来自 运行.
的应用程序
这是代码
var testFont = require('./components/svgText.js');
var timer = setInterval(function () {
var test = (testFont('TEST', 'BlenderProBook', 20).width === 39.75);
if (test) {
clearInterval(timer);
Router.run(routes, function (Handler) {
React.render(<Handler/>, document.body);
});
}
}, 50);
其中 svgTest.js
使用 Raphael SVG 生成 SVG 文本并像这样检索测量值:-
renderedTextSize = function (string, font, fontSize) {
var paper = Raphael(0, 0, 0, 0);
paper.canvas.style.visibility = 'hidden';
var el = paper.text(0, 0, string);
el.attr('font-family', font);
el.attr('font-size', fontSize);
var bBox = el.getBBox();
paper.remove();
return {
width: bBox.width,
height: bBox.height
};
};
module.exports = renderedTextSize;
这似乎工作得很好,尽管针对幻数(宽度)进行测试感觉有点老套。
我有一些网络字体是通过 Webfontloader 加载的,就像这样...
<script src="//ajax.googleapis.com/ajax/libs/webfont/1.5.10/webfont.js"></script>
<script>
WebFont.load({
custom: {
families: ['BlenderProBook', 'BlenderProMedium']
}
});
</script>
第一次加载页面时效果很好...问题是,刷新页面时它只在 html 请求时检索缓存的字体,而不是在我的 ReactJS 应用程序运行之前(当 Webfontloader 通常得到它们)。这对我来说太晚了,因为我在预生成的 SVG 中使用它们。
有没有办法强制它每次都获取未缓存的字体?或者更好的是,在正确的时间加载缓存的字体。
我找到了一个解决方案,如果没有其他人可以提供更好的解决方案,我会把它作为我的答案。
我的字体在应用程序中被广泛用于计算文本宽度和布局...(这就是为什么它需要在应用程序运行之前加载),所以我决定使用文本宽度代码作为测试以阻止来自 运行.
的应用程序这是代码
var testFont = require('./components/svgText.js');
var timer = setInterval(function () {
var test = (testFont('TEST', 'BlenderProBook', 20).width === 39.75);
if (test) {
clearInterval(timer);
Router.run(routes, function (Handler) {
React.render(<Handler/>, document.body);
});
}
}, 50);
其中 svgTest.js
使用 Raphael SVG 生成 SVG 文本并像这样检索测量值:-
renderedTextSize = function (string, font, fontSize) {
var paper = Raphael(0, 0, 0, 0);
paper.canvas.style.visibility = 'hidden';
var el = paper.text(0, 0, string);
el.attr('font-family', font);
el.attr('font-size', fontSize);
var bBox = el.getBBox();
paper.remove();
return {
width: bBox.width,
height: bBox.height
};
};
module.exports = renderedTextSize;
这似乎工作得很好,尽管针对幻数(宽度)进行测试感觉有点老套。