2017-02-24 2 views
0

Um einen Fehler zu beheben, der nur in Firefox auftritt, muss ich das loaded Versprechen eines FontFace verwenden. Ich verwende derzeit den folgenden Code für die:Internet Explorer: Ignoriere unbekannte ES6-Syntax

if (document.fonts) { 
 
    for (var fontFace of document.fonts.values()) { 
 
     if (fontFace['family'] == fontFamily) { 
 
      fontFace.loaded.then(doStuff); 
 
     } 
 
    } 
 
} else { 
 
    doStuff(); 
 
}

Dies funktioniert und zielt nur den Browser, die den Schriftart Laden API unterstützen. Aber wegen der for .. of protokolliert Internet Explorer einen Fehler und beendet die JS-Ausführung. Putting den Code in einem try .. catch Block funktioniert nicht, ignorieren den Fehler über window.onerror würde wahrscheinlich funktionieren, aber ist ziemlich hacky.

Gibt es eine Möglichkeit, über document.fonts.values zu iterieren, das auch vom IE unterstützt wird, oder kennen Sie eine bessere Möglichkeit, das loaded Versprechen in Browsern zu verwenden, die es unterstützen?

+1

Verwenden Sie eine andere Schleife und es sollte funktionieren. – alex

+0

Was meinst du mit einer anderen Schleife? 'document.fonts.values' gibt einen Iterator zurück, wobei das Iterieren mit' for .. in' oder mit einer "normalen" for-Schleife nicht funktioniert. – pingtux

+0

_ "Gibt es eine Möglichkeit, über document.fonts.values ​​zu iterieren, die auch von IE unterstützt wird" _ Nein, weil es in IE überhaupt keine 'document.fonts' gibt. – zeroflagL

Antwort

2

würde ich

const fontFace = Array.from(document.fonts).find(face => face.family === fontFamily); 
if (fontFace) { 
    fontFace.loaded.then(doStuff); 
} 

Array.from ein Array aus einem iterable schafft, empfehlen und dann können Sie die normale Array.prototype.some für die Spiele überprüfen verwenden.

Sie könnten dann Ihren ganzen Scheck an

const fontFace = document.fonts && 
    Array.from(document.fonts).find(face => face.family === fontFamily); 

if (fontFace) fontFace.loaded.then(doStuff); 
else doStuff(); 

vereinfachen vorausgesetzt, Sie doStuff wollen, wenn nicht die Schriftart Gesichter passen entweder laufen.

+0

Danke, aber das funktioniert nicht, weil ein 'FontFaceSet' nicht Array-artig ist (hat kein Attribut' length') und kann daher nicht mit 'Array.from' in ein Array konvertiert werden. – pingtux

+0

Es ist nicht Array-ähnlich, aber es ist iterierbar, also wird es mit 'Array.from' funktionieren. – loganfsmyth

+0

'Array.from (document.fonts)' gibt ein leeres Array (in Firefox und Chrome) zurück. – pingtux

1

Leider kann for-of Iteration in Ihrem Code nicht verwendet werden, wenn es in einem nicht unterstützten Browser ausgeführt werden soll. Der Fehler tritt auf, wenn der Code analysiert wird, bevor Ihre Bedingung ausgeführt und überprüft wird.

Wenn Sie wirklich for-of verwenden möchten, müssen Sie ein spezielles JS-Bundle für moderne Browser erstellen oder Ihren Code mit Babel verarbeiten, um Ihren Code in es5-kompatibel zu konvertieren.

+0

Danke, ich löste das Problem, indem ich 'next()' in einer 'do .. while' Schleife verwendete (siehe meine Antwort unten). – pingtux

1

löste ich das Problem mit dem folgenden Code:

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 mehr keinen Fehler protokollieren und der Code funktioniert in Firefox/Chrome.