-
Notifications
You must be signed in to change notification settings - Fork 0
/
jQuery-FontSpy.js
89 lines (74 loc) · 2.34 KB
/
jQuery-FontSpy.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* jQuery-FontSpy.js v3.0.0
* https://github.com/patrickmarabeas/jQuery-FontSpy.js
*
* Copyright 2013, Patrick Marabeas http://pulse-dev.com
* Released under the MIT license
* http://opensource.org/licenses/mit-license.php
*
* Date: 02/11/2015
*/
(function( w, $ ) {
fontSpy = function ( fontName, conf ) {
var $html = $('html'),
$body = $('body'),
fontFamilyName = fontName;
// Throw error if fontName is not a string or not is left as an empty string
if (typeof fontFamilyName !== 'string' || fontFamilyName === '') {
throw 'A valid fontName is required. fontName must be a string and must not be an empty string.';
}
var defaults = {
font: fontFamilyName,
fontClass: fontFamilyName.toLowerCase().replace( /\s/g, '' ),
success: function() {},
failure: function() {},
testFont: 'Courier New',
testString: 'QW@HhsXJ',
glyphs: '',
delay: 50,
timeOut: 1000,
callback: $.noop
};
var config = $.extend( defaults, conf );
var $tester = $('<span>' + config.testString+config.glyphs + '</span>')
.css('position', 'absolute')
.css('top', '-9999px')
.css('left', '-9999px')
.css('visibility', 'hidden')
.css('fontFamily', config.testFont)
.css('fontSize', '250px');
$body.append($tester);
var fallbackFontWidth = $tester.outerWidth();
$tester.css('fontFamily', config.font + ',' + config.testFont);
var failure = function () {
$html.addClass("no-"+config.fontClass);
if( config && config.failure ) {
config.failure();
}
config.callback(new Error('FontSpy timeout'));
$tester.remove();
};
var success = function () {
config.callback();
$html.addClass(config.fontClass);
if( config && config.success ) {
config.success();
}
$tester.remove();
};
var retry = function () {
setTimeout(checkFont, config.delay);
config.timeOut = config.timeOut - config.delay;
};
var checkFont = function () {
var loadedFontWidth = $tester.outerWidth();
if (fallbackFontWidth !== loadedFontWidth){
success();
} else if(config.timeOut < 0) {
failure();
} else {
retry();
}
}
checkFont();
}
})( this, jQuery );