2016-02-24 5 views
16

Wenn ein Zeichen in ein Textfeld eingegeben wird und die aktuell verwendete Schriftart dieses Zeichen nicht unterstützt, wird eine Ersatzschrift für dieses Zeichen verwendet. Ist es möglich, über Javascript oder andere Mittel zu informieren, wenn dies geschieht? Versuchen, ein Skript zu erstellen, das den Benutzer warnt, wenn ein bestimmtes Zeichen von der Schriftart nicht unterstützt wird. Danke für Ihre Hilfe!Ist es möglich zu erkennen, wenn ein Browser eine Fallback-Schriftart anstelle der in der CSS angegebenen verwendet?

+0

So einfach, um wirklich klar: Der Browser die Schrift hat (im Gegensatz zu, wenn Sie geben 'font-face: wanglebrat, sans-serif' an und der Browser hat nicht' wanglebrat' und verwendet 'sans-serif', aber Sie möchten wissen, wenn * bestimmte Zeichen * fehlen, oder? –

+0

@ T.J.Crowder Ja, das ist korrekt – Hendeca

+1

Verwendet der Browser wirklich eine andere Schriftart, wenn ein Zeichen in eine Eingabe eingegeben wird, die die aktuelle Schriftart nicht unterstützt? – adeneo

Antwort

2

Das klingt wie ein Job für so etwas wie fontkit.js oder opentype.js oder sogar Font.js, die alle Schriftarten für Glyph-Unterstützung testen können. Systemfonts werden auf diese Weise nicht behandelt (Font.js funktioniert möglicherweise, es wird wahrscheinlich eine Breite von 0 für das getestete Glyph angegeben), aber dann sind dies in der Regel die "websicheren" Fonts, von denen wir bereits genau wissen, welche Glyphen unterstützt werden jeder benutzt die gleichen. Zum Testen von "Löchern" in einer benutzerdefinierten Schriftart sollte jedoch jeder der zuvor genannten drei Schritte das ausführen, was Sie implementieren wollten.

+0

Ich bin fasziniert von Font.js, da es am einfachsten zu sein scheint und kein Knotenmodul ist, aber beim Lesen der Dokumentation konnte ich nicht genau herausfinden, wie ich auf das Vorhandensein einer bestimmten Glyphe testen würde. Können Sie mich auf die richtigen Methoden hinweisen, um das zu erreichen? – Hendeca

+0

Sie suchen nach 'font.measureText (textString, fontSize));', wahrscheinlich als 'forEach'-Schleife für alle Glyphen, die gerendert werden müssen. Jeder 'measureText', der ein Metrikobjekt mit der Breite 0 ergibt, wird von der fraglichen Schriftart nicht sehr unterstützt. –

+1

Beachten Sie auch, dass wir nicht mehr in einer Welt mit Bibliotheken "nur für Knoten" oder "nur für Browser" leben. Es ist alles JS, so dass die Dinge in beiden Fällen gut funktionieren, solange (genau wie für reine Browser-Lösungen) die richtigen Shims vorhanden sind. OpenType.js funktioniert in beiden zum Beispiel. FontKit.js kann für den Browser trivial (mit 'browserify --standalone' oder etwas) gebündelt werden, und Font.js wird gerne in Node arbeiten, vorausgesetzt, Sie können eine Leinwand dafür shimmen. –

2

Wenn Sie die Breite des Zeichens in der Schriftart überprüfen und es mit dem Fallback vergleichen, können Sie ableiten, ob es die Fallback-Schriftart verwendet. Dieser Test ist wahrscheinlich nicht 100% zuverlässig, aber man kann so etwas tun:

var text = $(".main-text").html(); 
 
var chars = text.split(""); 
 
for(var i = 0, len = chars.length; i < len; i++){ 
 
\t var str = chars[i]; str+=str;str+=str;str+=str; 
 
\t $("#test1, #test2").html(str); 
 
\t var w1 = $("#test1").width(); 
 
\t var w2 = $("#test2").width(); 
 
\t if(w1 == w2 && w1 != 0){ 
 
\t \t alert("char not supported " + chars[i]); 
 
\t } 
 
}
.main-text { 
 
    width: 50%; 
 
    height: 300px; 
 
    font-family: Impact, sans-serif; 
 
    font-size: 16px; 
 
} 
 
#test1, #test2 { 
 
    position: fixed; 
 
    top: -100px; 
 
    font-size: 16px; 
 
} 
 
#test1 { 
 
    font-family: Impact, sans-serif; 
 
} 
 
#test2 { 
 
    font-family: sans-serif; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<textarea class="main-text"> 
 
Serif Font 
 
This E is not supported: ể 
 
</textarea> 
 
<span id="test1"></span> 
 
<span id="test2"></span>

jsfiddle

+0

Vielleicht ist es nicht klar, dass Sie die 'test1' und' test2' Elemente hier mit den verschiedenen Schriftfamilien definieren müssen. Wenn Sie eine große Schriftgröße festlegen, werden kleinere Unterschiede erkannt. – Kwebble

+0

Ich bearbeitete die Antwort, einschließlich des gesamten Codes. – jvilhena

+1

Dies ist eine clevere Lösung, obwohl ich finde, dass es nicht mit allen Schriftarten funktioniert. Ich habe versucht, die Schriftart zurück zu Didot als Test zu ändern und festgestellt, dass jedes Zeichen als ungültig übereinstimmte. Ich habe einen Ereignis-Listener hinzugefügt, der auf Änderungen im Textbereich wartet und den Inhalt über val() anstelle von html() zieht, so dass ich den Text ändern und Live-Ergebnisse zur Vereinfachung sehen kann. https://jsfiddle.net/Hendeca/2xpLzuyk/ – Hendeca