1(function() { 2 var Set = (function() { 3 var add = function(item) { 4 var i, data = this._data; 5 for (i = 0; i < data.length; i++) { 6 if (data[i] === item) { 7 return; 8 } 9 } 10 this.size ++; 11 data.push(item); 12 return data; 13 }; 14 15 var Set = function(data) { 16 this.size = 0; 17 this._data = []; 18 var i; 19 if (data.length > 0) { 20 for (i = 0; i < data.length; i++) { 21 add.call(this, data[i]); 22 } 23 } 24 }; 25 Set.prototype.add = add; 26 Set.prototype.get = function(index) { return this._data[index]; }; 27 Set.prototype.has = function(item) { 28 var i, data = this._data; 29 for (i = 0; i < data.length; i++) { 30 if (this.get(i) === item) { 31 return true; 32 } 33 } 34 return false; 35 }; 36 Set.prototype.is = function(map) { 37 if (map._data.length !== this._data.length) { return false; } 38 var i, j, flag, tData = this._data, mData = map._data; 39 for (i = 0; i < tData.length; i++) { 40 for (flag = false, j = 0; j < mData.length; j++) { 41 if (tData[i] === mData[j]) { 42 flag = true; 43 break; 44 } 45 } 46 if (!flag) { return false; } 47 } 48 return true; 49 }; 50 Set.prototype.values = function() { 51 return this._data; 52 }; 53 return Set; 54 })(); 55 56 window.Lazyload = (function(doc) { 57 var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this; 58 var createNode = function(name, attrs) { 59 var node = doc.createElement(name), attr; 60 for (attr in attrs) { 61 if (attrs.hasOwnProperty(attr)) { 62 node.setAttribute(attr, attrs[attr]); 63 } 64 } 65 return node; 66 }; 67 var end = function(type, url) { 68 var s, q, qi, cbs, i, j, cur, val, flag; 69 if (type === 'js' || type ==='css') { 70 s = sources[type], q = queue[type]; 71 s[url] = true; 72 for (i = 0; i < q.length; i++) { 73 cur = q[i]; 74 if (cur.urls.has(url)) { 75 qi = cur, val = qi.urls.values(); 76 qi && (cbs = qi.callbacks); 77 for (flag = true, j = 0; j < val.length; j++) { 78 cur = val[j]; 79 if (!s[cur]) { 80 flag = false; 81 } 82 } 83 if (flag && cbs && cbs.length > 0) { 84 for (j = 0; j < cbs.length; j++) { 85 cbs[j].call(context); 86 } 87 qi.load = true; 88 } 89 } 90 } 91 } 92 }; 93 var load = function(type, urls, callback) { 94 var s, q, qi, node, i, cur, 95 _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url; 96 if (type === 'js' || type ==='css') { 97 s = sources[type], q = queue[type]; 98 for (i = 0; i < q.length; i++) { 99 cur = q[i]; 100 if (_urls.is(cur.urls)) { 101 qi = cur; 102 break; 103 } 104 } 105 val = _urls.values(); 106 if (qi) { 107 callback && (qi.load || qi.callbacks.push(callback)); 108 callback && (qi.load && callback()); 109 } else { 110 q.push({ 111 urls: _urls, 112 callbacks: callback ? [callback] : [], 113 load: false 114 }); 115 for (i = 0; i < val.length; i++) { 116 node = null, url = val[i]; 117 if (s[url] === undefined) { 118 (type === 'js' ) && (node = createNode('script', { src: url })); 119 (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url })); 120 if (node) { 121 node.onload = (function(type, url) { 122 return function() { 123 end(type, url); 124 }; 125 })(type, url); 126 (doc.head || doc.body).appendChild(node); 127 s[url] = false; 128 } 129 } 130 } 131 } 132 } 133 }; 134 return { 135 js: function(url, callback) { 136 load('js', url, callback); 137 }, 138 css: function(url, callback) { 139 load('css', url, callback); 140 } 141 }; 142 })(this.document); 143})();