2016-02-24 18 views
16

Se un carattere viene inserito in un campo di testo e il carattere attualmente applicato non supporta quel carattere, per quel carattere viene usato un carattere di backup. È possibile dire via Javascript o altri mezzi quando questo sta accadendo? Cercando di creare uno script che avvisi l'utente se un determinato carattere non è supportato dal carattere. Grazie per l'aiuto!È possibile rilevare quando un browser utilizza un font di fallback anziché quello primario specificato nel CSS?

+0

Quindi, solo per essere molto chiaro: Il browser ha il tipo di carattere (al contrario di quando tu specifichi 'font-face: wanglebrat, sans-serif' e il browser non ha' wanglebrat' e quindi usa 'sans-serif'), ma vuoi sapere quando mancano * caratteri specifici *, giusto? –

+0

@ T.J.Crowder Sì, è corretto – Hendeca

+1

Il browser usa davvero un font diverso se un carattere viene inserito in un input che il font corrente non supporta? – adeneo

risposta

2

questo suona come un lavoro per qualcosa come fontkit.js o opentype.js, o anche Font.js, ognuno dei quali può testare i font per il supporto glifo. I font di sistema non sono trattati in questo modo (Font.js potrebbe funzionare, probabilmente riporterà una larghezza 0 per il glifo testato) ma in genere si tratta dei caratteri "sicuri per il Web", di cui sappiamo già esattamente quali glifi sono supportati perché tutti usano gli stessi Per testare "buchi" in un font personalizzato, tuttavia, ognuno dei tre precedentemente citati dovrebbe già fare ciò che si intendeva implementare.

+0

Sono affascinato da Font.js perché sembra essere il più semplice e non è un modulo nodo, ma leggendo la documentazione non sono riuscito a capire come testare la presenza di un glifo specifico. Puoi indicarmi i metodi adeguati per raggiungere questo obiettivo? – Hendeca

+0

Stai cercando 'font.measureText (textString, fontSize));', probabilmente come un ciclo 'forEach' per tutti i glifi che richiedono il rendering. Qualsiasi 'measureText' che produce un oggetto metriche con larghezza 0 non è supportato dal font in questione. –

+1

nota anche che non viviamo più in un mondo con le librerie "solo per nodo" o "solo per browser". È tutto JS, quindi la maggior parte delle volte le cose funzioneranno bene in entrambe, purché (proprio come per le soluzioni browser pure) tu abbia gli shim giusti. OpenType.js funziona in entrambi, ad esempio. FontKit.js può essere banalmente raggruppato per il browser (con 'browserify --standalone' o qualcosa del genere), e Font.js funzionerà felicemente nel Nodo purché sia ​​possibile eseguire il shim di una tela per esso. –

2

Controllando la larghezza del carattere nel carattere e confrontandolo con il fallback, è possibile dedurre se sta utilizzando il carattere di fallback. Questo test è probabilmente non affidabile al 100%, ma si può fare qualcosa di simile:

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

Forse non è chiaro che sia necessario definire gli elementi 'test1' e' test2' qui con le diverse famiglie di caratteri. E se si imposta su di essi una grande dimensione del carattere, verranno rilevate differenze più piccole. – Kwebble

+0

ho modificato la risposta, incluso tutto il codice. – jvilhena

+1

Questa è una soluzione intelligente, anche se sto scoprendo che non funziona con tutti i tipi di carattere. Ho provato a cambiare il font in Didot come test e ho scoperto che ogni carattere corrispondeva come non valido. Ho aggiunto un listener di eventi che ascolta le modifiche alla textarea e carica il contenuto tramite val() anziché html() in modo da poter modificare il testo e visualizzare i risultati live per comodità. https://jsfiddle.net/Hendeca/2xpLzuyk/ – Hendeca