144 lines
4.0 KiB
JavaScript
144 lines
4.0 KiB
JavaScript
(function() {
|
|
var Set = (function() {
|
|
var add = function(item) {
|
|
var i, data = this._data;
|
|
for (i = 0; i < data.length; i++) {
|
|
if (data[i] === item) {
|
|
return;
|
|
}
|
|
}
|
|
this.size ++;
|
|
data.push(item);
|
|
return data;
|
|
};
|
|
|
|
var Set = function(data) {
|
|
this.size = 0;
|
|
this._data = [];
|
|
var i;
|
|
if (data.length > 0) {
|
|
for (i = 0; i < data.length; i++) {
|
|
add.call(this, data[i]);
|
|
}
|
|
}
|
|
};
|
|
Set.prototype.add = add;
|
|
Set.prototype.get = function(index) { return this._data[index]; };
|
|
Set.prototype.has = function(item) {
|
|
var i, data = this._data;
|
|
for (i = 0; i < data.length; i++) {
|
|
if (this.get(i) === item) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
Set.prototype.is = function(map) {
|
|
if (map._data.length !== this._data.length) { return false; }
|
|
var i, j, flag, tData = this._data, mData = map._data;
|
|
for (i = 0; i < tData.length; i++) {
|
|
for (flag = false, j = 0; j < mData.length; j++) {
|
|
if (tData[i] === mData[j]) {
|
|
flag = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!flag) { return false; }
|
|
}
|
|
return true;
|
|
};
|
|
Set.prototype.values = function() {
|
|
return this._data;
|
|
};
|
|
return Set;
|
|
})();
|
|
|
|
window.Lazyload = (function(doc) {
|
|
var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
|
|
var createNode = function(name, attrs) {
|
|
var node = doc.createElement(name), attr;
|
|
for (attr in attrs) {
|
|
if (attrs.hasOwnProperty(attr)) {
|
|
node.setAttribute(attr, attrs[attr]);
|
|
}
|
|
}
|
|
return node;
|
|
};
|
|
var end = function(type, url) {
|
|
var s, q, qi, cbs, i, j, cur, val, flag;
|
|
if (type === 'js' || type ==='css') {
|
|
s = sources[type], q = queue[type];
|
|
s[url] = true;
|
|
for (i = 0; i < q.length; i++) {
|
|
cur = q[i];
|
|
if (cur.urls.has(url)) {
|
|
qi = cur, val = qi.urls.values();
|
|
qi && (cbs = qi.callbacks);
|
|
for (flag = true, j = 0; j < val.length; j++) {
|
|
cur = val[j];
|
|
if (!s[cur]) {
|
|
flag = false;
|
|
}
|
|
}
|
|
if (flag && cbs && cbs.length > 0) {
|
|
for (j = 0; j < cbs.length; j++) {
|
|
cbs[j].call(context);
|
|
}
|
|
qi.load = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
var load = function(type, urls, callback) {
|
|
var s, q, qi, node, i, cur,
|
|
_urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
|
|
if (type === 'js' || type ==='css') {
|
|
s = sources[type], q = queue[type];
|
|
for (i = 0; i < q.length; i++) {
|
|
cur = q[i];
|
|
if (_urls.is(cur.urls)) {
|
|
qi = cur;
|
|
break;
|
|
}
|
|
}
|
|
val = _urls.values();
|
|
if (qi) {
|
|
callback && (qi.load || qi.callbacks.push(callback));
|
|
callback && (qi.load && callback());
|
|
} else {
|
|
q.push({
|
|
urls: _urls,
|
|
callbacks: callback ? [callback] : [],
|
|
load: false
|
|
});
|
|
for (i = 0; i < val.length; i++) {
|
|
node = null, url = val[i];
|
|
if (s[url] === undefined) {
|
|
(type === 'js' ) && (node = createNode('script', { src: url }));
|
|
(type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
|
|
if (node) {
|
|
node.onload = (function(type, url) {
|
|
return function() {
|
|
end(type, url);
|
|
};
|
|
})(type, url);
|
|
(doc.head || doc.body).appendChild(node);
|
|
s[url] = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
return {
|
|
js: function(url, callback) {
|
|
load('js', url, callback);
|
|
},
|
|
css: function(url, callback) {
|
|
load('css', url, callback);
|
|
}
|
|
};
|
|
})(this.document);
|
|
})();
|