-
Notifications
You must be signed in to change notification settings - Fork 0
/
bootloader.js
108 lines (108 loc) · 3.8 KB
/
bootloader.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*BootLoader*/
var BootLoader=(function namespace(){
function Init(setting){
if(typeof(setting)=="object"){
config.noconsole=!!setting.NoMessage;
}
}
Init.prototype.loadJS=function(scripts,callback){
//check
if(!Array.isArray(scripts)){
console.error("First parameter has to be an array of string, represent the JavaScript files that needs to be loaded.");
return;
}
if(callback&&typeof(callback)!="function"){
console.error("Second parameter is optional, and has to be an function that will be called after all JavaScript files is loaded.");
return;
}
//load
reset(scripts.length,callback,null);
for(var i in scripts){
var script=document.createElement("script");
if(script.readyState){ //IE
script.onreadystate=function(){
if(script.readyState=="loaded"||script.readyState=="complete"){
script.onreadystate=null;
checkLoad();
}
};
}else{
script.onload=function(){
checkLoad();
};
}
script.src=String(scripts[i]);
document.getElementsByTagName("head")[0].appendChild(script);
}
};
Init.prototype.loadImage=function(images,callback){
//check
//load
reset(images.length,callback,new Array(images.length));
for(var i in images){
var img=new Image();
img.crossOrigin="Anonymous";
img.onload=(function(idx){
return function(e){
var canvas=document.createElement("canvas");
canvas.width=this.naturalWidth;
canvas.height=this.naturalHeight;
canvas.getContext("2d").drawImage(this,0,0);
config.result[idx]=canvas.toDataURL();
checkLoad();
};
})(i);
img.src=images[i];
}
};
Init.prototype.loadFont=function(fonts,callback){
//check
//load
reset(fonts.length,callback,null);
function ArrayBufferToBase64(buffer) {
var base64='';
var bytes=new Uint8Array(buffer);
for (var i=0;i<bytes.byteLength;i++){
base64+=String.fromCharCode(bytes[i]);
}
return window.btoa(base64);
}
for(var i in fonts){
var ajax=new XMLHttpRequest();
ajax.responseType='arraybuffer';
ajax.onreadystatechange=(function(o){
return function(e){
if(this.readyState==4&&this.status==200){
var s=ArrayBufferToBase64(this.response);
var css=document.createElement("style");
css.innerHTML='@font-face{font-family:"'+o.fontFamily+'";src:url(data:'+o.fontType+';base64,'+s+')}';
document.getElementsByTagName("head")[0].appendChild(css);
checkLoad();
}
};
})(fonts[i]);
ajax.open("GET",fonts[i].fontUrl,true);
ajax.send();
}
};
function checkLoad(){
config.loadedCount++;
if(config.loadedCount==config.targetCount){
config.callback&&config.callback.call(this,config.result);
}
}
function reset(count,callback,result){
config.callback=callback;
config.targetCount=count;
config.loadedCount=0;
config.result=result;
}
var config={
callback:null,
targetCount:0,
loadedCount:0,
noconsole:false,
result:null,
};
return Init;
}());