我很难使用通过TypeKit webfontloader加载的字体作为在画布元素上绘制的文本的字体。
我将其归结为以下测试用例:
WebFont.load({
google: {
families: ['Droid Sans', 'Droid Serif']
},
monotype: {
projectId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' //this is valid & working
},
fontactive : function(font, fvd){
testFont(font, fvd, 'active');
},
fontinactive : function(font, fvd){
testFont(font, fvd, 'inactive');
}
});
function testFont(font, fvd, state){
console.log('loaded ' + state, font, fvd);
var $canvas = $('<canvas>').attr({width: 400, height: 100}).appendTo($('body'));
var canvas = $canvas[0];
var ctx = canvas.getContext('2d');
ctx.fillStyle = 'black';
ctx.font = '30px ' + font;
ctx.fillText('CANVAS PARTY YALL!', 50, 50);
}
每种字体的回调都会触发,但画布文本中并未使用该字体。一个奇怪的方面是从 fonts.com 加载的字体(monotype
)部分确实将自己声明为fontinactive
,但我可以毫无问题地将它们应用于所有 HTML。Google 字体总是会触发fontactive
.
另一个奇怪的方面是谷歌字体将在大约 20 种情况下显示,但是当我将我的testFont
函数包装在 asetTimeout
中并延迟1000
ms 时,这种行为会反转并不时显示 fonts.com 字体。
所有这一切让我得出结论,处理程序可能触发得太早,但我不知道该怎么做(而不是像超时和祈祷这样的骇人听闻的东西)。知道我做错了什么或者我能做些什么来解决这个问题吗?
编辑:为了增加混乱,我刚刚注意到 fonts.com 字体实际上在 IE9 中运行良好。所有其他浏览器似乎都在做我上面描述的事情。