2017-02-24 53 views
0

为了解决这个问题只发生在Firefox中的错误,我需要使用FontFaceloaded承诺。我目前使用下面的代码为:Internet Explorer中:忽略未知ES6语法

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吗?

+1

使用不同的循环,它应该工作。 – alex

+0

你是什么意思与不同的循环? 'document.fonts.values'返回一个迭代器,用'for .. in'或者用一个“normal”循环迭代不起作用。 – pingtux

+0

_“有没有办法来遍历也由IE支持document.fonts.values” _没有,因为没有'document.fonts'在IE摆在首位。 – zeroflagL

回答

2

我建议

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

+0

谢谢,但这不起作用,因为'FontFaceSet'不是数组(不具有'length'属性),因此无法使用'Array.from'转换为数组。 – pingtux

+0

它不是数组,但它是可迭代的,所以它可以与'Array.from'一起使用。 – loganfsmyth

+0

'Array.from(document.fonts)'返回一个空数组(在Firefox和Chrome中)。 – pingtux

1

不幸的是,你不能使用你的代码for-of迭代,当它应该是在不支持的浏览器中运行。问题在于在执行和检查条件之前解析代码时发生错误。

如果你真的想用换的,你需要创建一个特殊的JS-束现代浏览器或处理您的代码通天转换代码,ES5兼容。

+0

谢谢,我在'do .. while'循环中使用'next()'解决了这个问题(请参阅下面的答案)。 – pingtux

1

我解决了用下面的代码的问题:

if (document.fonts) { 
 
    var iter = document.fonts.values(); 
 
    do { 
 
     var item = iter.next(); 
 
     var fontFace = item.value; 
 
     if (fontFace && fontFace['family'] == fontFamilyStr) { 
 
      fontFace.loaded.then(doStuff); 
 
     } 
 
    } while (!item.done); 
 
} else { 
 
      doStuff(); 
 
}

IE不记录错误不再和代码工作在Firefox/Chrome浏览器。

相关问题