要修复仅在Firefox中发生的错误,我需要使用loaded
的FontFace
承诺。我目前使用以下代码:
if (document.fonts) {
for (var fontFace of document.fonts.values()) {
if (fontFace['family'] == fontFamily) {
fontFace.loaded.then(doStuff);
}
}
} else {
doStuff();
}
这有效,并且仅针对支持字体加载API的浏览器。但是由于
for .. of
,Internet Explorer会记录错误并停止JS执行。将代码放在try .. catch
块中不起作用,忽略通过window.onerror
的错误可能会起作用,但是很不客气。有没有一种方法可以遍历IE也支持的
document.fonts.values
,或者您知道在支持它的浏览器中使用loaded
Promise的更好方法吗? 最佳答案
我建议
const fontFace = Array.from(document.fonts).find(face => face.family === fontFamily);
if (fontFace) {
fontFace.loaded.then(doStuff);
}
Array.from
从一个可迭代对象创建一个数组,然后可以使用普通的Array.prototype.some
检查匹配项。然后,您可以将整个支票简化为
const fontFace = document.fonts &&
Array.from(document.fonts).find(face => face.family === fontFamily);
if (fontFace) fontFace.loaded.then(doStuff);
else doStuff();
假设您要运行
doStuff
,如果两个字体都不匹配。