/
preload.js
78 lines (73 loc) · 1.9 KB
/
preload.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
(function( window, steal, undefined ) {
var extend = steal.extend,
each = steal.each,
isGecko = "MozAppearance" in document.documentElement.style,
URI = steal.URI,
preloadScript = function( src, callback ) {
var deferred = preloading[ src ] || new Deferred(),
complete = function() {
delete preloading[src];
deferred.resolve( src );
};
if ( ! ( src in preloading )) {
preloading[ src ] = deferred;
if ( isGecko ) {
steal.request({
src: src
}, complete );
} else {
elem = document.createElement("img");
elem.onload = elem.onerror = complete;
elem.src = src;
}
}
return deferred;
},
map = function( arr, callback ) {
var result = [];
each( arr, function( i, v ) {
var temp = callback.call( arr, v, i, arr );
if ( temp !== false ) {
result.push( temp );
}
});
return result;
},
resolveUris = function( srcs ) {
return map( srcs, function( src ) {
return URI.root().join( URI( URI( src ).addJS().normalize()).insertMapping() );
});
},
preloading = {},
Deferred = steal.Deferred,
origLoad = Resource.prototype.load;
extend( steal, {
preload: function() {
var deferred = new Deferred();
Deferred
.when.apply( Deferred, map( resolveUris( arguments ), preloadScript ))
.done(function() {
deferred.resolve.apply( deferred, arguments );
});
return deferred;
}
});
extend(Resource.prototype, {
/**
* This clobbers the original steal.load function to make sure we don't
* load something twice.
*/
load: function( returnScript ) {
var self = this,
src = "" + self.options.src;
if ( self.options && self.options.buildType !== "fn" && src in preloading ) {
preloading[ src ].done(function() {
self.loading = true;
self.loaded.resolve();
});
} else {
origLoad.apply( self, arguments );
}
}
});
}( window, steal ));