• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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})();