2016-02-24 9 views
16

Bir metin alanına bir karakter girilirse ve o anda uygulanmış font bu karakteri desteklemiyorsa, bu karakter için bir yedek yazı tipi kullanılır. Bu olduğunda Javascript veya başka yollarla söylemek mümkün mü? Belirli bir karakter font tarafından desteklenmiyorsa kullanıcıyı uyaran bir betik oluşturmaya çalışıyorum. Yardım ettiğin için teşekkür ederim!Bir tarayıcının CSS'de belirtilen birincil yerine bir yedek yazı tipi kullandığını algılamak mümkün mü?

+0

: Bu test muhtemelen% 100 güvenilir değildir, ancak böyle bir şey yapabilecekken aksine tarayıcı (yazı tipi vardır "font-face: wanglebrat, sans-serif" ve tarayıcının "wanglebrat" özelliği yoktur ve "sans-serif" işlevini kullanmazsınız), ancak * belirli karakterlerin * ne zaman eksik olduğunu bilmek istersiniz? –

+0

@ T.J.Crowder Evet, doğru – Hendeca

+1

Geçerli yazı tipinin desteklemediği bir girdiye bir karakter girilirse tarayıcı gerçekten farklı bir yazı tipi kullanıyor mu? – adeneo

cevap

2

fontkit.js veya opentype.js, hatta Font.js gibi bir şey için bir işe benzer, hepsi glif desteği için yazı tiplerini test edebilir. Sistem yazı tipleri bu şekilde ele alınmaz (Font.js işe yarayabilir, muhtemelen test edilen glif için 0 genişliğini rapor edecektir), ancak bunlar genellikle hangi web sitelerinin hangi gliflerin desteklendiğini bildiğimiz "web güvenli" fontlardır. herkes aynı olanları kullanır. Yine de, özel bir fontta "delikler" test etmek için, daha önce sözü edilen üçten herhangi birinin uygulamak istediğiniz şeyi yapması gerekir.

+0

Font.js tarafından ilgimi çeken en basit ve bir düğüm modülü değil. Ancak belgeleri okurken belirli bir glifin varlığını nasıl test edeceğimi anlayamadım. Bunu başarmak için uygun yöntemlere işaret edebilir misiniz? – Hendeca

+0

'font.measureText (textString, fontSize));', muhtemelen görüntülemeye ihtiyaç duyan tüm glifler için bir 'forEach' döngüsü olarak arıyorsunuz. Genişlik 0 olan bir metrik nesnesini veren herhangi bir 'measureText', söz konusu yazı tipi tarafından pek desteklenmez. –

+1

, artık sadece "yalnızca düğüm için" veya "yalnızca tarayıcı için" kütüphaneleri olan bir dünyada yaşamadığımıza dikkat çekiyor. Hepsi JS'dir, bu yüzden çoğu zaman, her ikisi de iyi çalışır (tıpkı saf tarayıcı çözümleri için olduğu gibi) yerinde doğru şimleri vardır. OpenType.js, her ikisi için de çalışır. FontKit.js, tarayıcı için ("browserify --standalone" veya bir şeyle birlikte) kolayca paketlenebilir ve Font.js, bir tuvali bindirmeniz şartıyla, Düğümde mutlu bir şekilde çalışır. –

2

Yazı tipindeki karakterin genişliğini kontrol ederek ve geri dönüşle karşılaştırarak, geri dönüş yazı tipini kullanıyorsa, çıkabilirsiniz. Yani sadece gerçekten açık olmak

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

Belki de 'test1' ve 'test2' elemanlarını burada farklı font-aileleriyle tanımlamanız gerektiği açık değil. Ve büyük bir yazı tipi boyutu belirlerseniz, daha küçük farklılıklar algılanır. – Kwebble

+0

Tüm kodu da içeren cevabı düzenledim. – jvilhena

+1

Bu, tüm yazı tipleriyle çalışmadığını bulsam da akıllıca bir çözümdür. Yazı tipini Didot'a bir test olarak değiştirmeyi denedim ve her karakterin geçersiz olarak eşleştiğini tespit ettim. Textarea'daki değişiklikleri dinleyen bir etkinlik dinleyicisi ekledim ve içeriği html() yerine val() ile çektim; böylece metni değiştirip kolaylık sağlamak için canlı sonuçları görebildim. https://jsfiddle.net/Hendeca/2xpLzuyk/ – Hendeca

İlgili konular