要修复仅在Firefox中发生的错误,我需要使用loadedFontFace承诺。我目前使用以下代码:



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,如果两个字体都不匹配。

08-06 09:36