Hat mein Besucher Schriftart XY installiert?
Hat der Benutzer Schriftart XY installiert?
Bei meinem aktuellen WordPress-Projekt wurde ich mit der Aufgabe konfrontiert, zu prüfen ob der Webseiten-Besucher die gewünschte Schriftart, in meinem Fall Rockwell, installiert hat. Mein Lösungsansatz ist eine Javascript Funktion, die die Breite jedes Buchstaben und jeder Zahl berechnet und daraus eine Prüfsumme generiert.
Der Besucher meiner Webseite generiert ebenfalls eine Prüfsumme, die dann mit der Original-Prüfsumme verglichen wird. Ich kann leider keine Garantie geben, dass mein Lösungsansatz mit jeder Schriftart funktioniert.
Prüfsumme erstellen
Auf einem Rechner, wo die Schriftart Rockwell installiert ist, lasse ich mir die Prüfsumme generieren:
var checksum = Grolba.Font.getChecksum('Rockwell');
Die Funktion erstellt <span> Elemente mit jeweils einer Zahl oder einem Buchstaben. Danach wird die Breite des Elements ausgelesen und in die Prüfsumme geschrieben. Das Format sieht wie folgt aus:
Schriftgröße:Zeichen:Breite;Schriftgröße:Zeichen:Breite...
500:a:265;500:b:323;500:c:260;500:d:313;500:e:287...
Abfrage einfügen
Nun kann ich anhand der Prüfsumme und dem Namen der Schriftart ermitteln ob der Besucher die Schrift installiert hat oder nicht.
var checksum = '500:a:265;500:b:323;500:c:260;500:d:313;500:e:287...';
if(Grolba.Font.hasFont('Rockwell', checksum)) {
// der Benutzer hat Rockwell installiert
} else {
// der Benutzer hat Rockwell nicht installiert
}
Beispiel: Rockwell
Quellcode
In dieser Version nutze ich jQuery 1.4.2
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
var Grolba = Grolba || {};
Grolba.Font = {
fonts: {},
hasFont: function(fontFamily, checksum) {
if(typeof checksum !== "undefined") {
return (this.getChecksum(fontFamily) === checksum);
}
if(typeof this.fonts[fontFamily] !== "undefined") {
return (this.getChecksum(fontFamily) === this.fonts[fontFamily]);
}
alert('No checksum found');
},
getChecksum: function(fontFamily) {
var strCache = '';
var intSize = 500;
var strChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
for(var i = 0; i < strChars.length; i++) {
var temp = $('<span>' + strChars[i] + '</span>').css({
padding: 0,
fontSize: intSize + 'px',
fontFamily: fontFamily
}).appendTo($('body'));
strCache += intSize + ':' + strChars[i] + ':' + temp.width() + ';';
temp.remove();
}
return strCache;
}
}
Lizenz
Creative Commons: Namensnennung-Weitergabe unter gleichen Bedingungen
Wie geht es weiter?
Ich wäre sehr dankbar wenn Ihr mir eure Erfahrungen mitteilt. Ihr könnt die Kommentar-Funktion nutzen, mir eine E-Mail schreiben oder mich über Twitter kontaktieren. Gerne lese ich auch Verbesserungsvorschläge oder Änderungswünsche