Zach Wise
13 years ago
1 changed files with 251 additions and 0 deletions
@ -0,0 +1,251 @@ |
|||||||
|
/* |
||||||
|
LoadLib |
||||||
|
Based on LazyLoad by Ryan Grove |
||||||
|
https://github.com/rgrove/lazyload/
|
||||||
|
Copyright (c) 2011 Ryan Grove <ryan@wonko.com> |
||||||
|
All rights reserved. |
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of |
||||||
|
this software and associated documentation files (the 'Software'), to deal in |
||||||
|
the Software without restriction, including without limitation the rights to |
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so, |
||||||
|
subject to the following conditions: |
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all |
||||||
|
copies or substantial portions of the Software. |
||||||
|
|
||||||
|
================================================== */ |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(typeof VMM != 'undefined' && typeof VMM.LoadLib == 'undefined') { |
||||||
|
//VMM.LoadLib.js('http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', onJQueryLoaded);
|
||||||
|
//VMM.LoadLib.css('http://someurl.css', onCSSLoaded);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VMM.LoadLib = (function (doc) { |
||||||
|
var env, |
||||||
|
head, |
||||||
|
pending = {}, |
||||||
|
pollCount = 0, |
||||||
|
queue = {css: [], js: []}, |
||||||
|
styleSheets = doc.styleSheets; |
||||||
|
|
||||||
|
var loaded_Array = []; |
||||||
|
|
||||||
|
function isLoaded(url) { |
||||||
|
|
||||||
|
for(var i=0; i<loaded_Array.length; i++) { |
||||||
|
var has_been_loaded = false; |
||||||
|
if (loaded_Array[i] == url) { |
||||||
|
has_been_loaded = true; |
||||||
|
} |
||||||
|
|
||||||
|
if (!has_been_loaded) { |
||||||
|
loaded_Array.push(url); |
||||||
|
} |
||||||
|
|
||||||
|
return has_been_loaded; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
function createNode(name, attrs) { |
||||||
|
var node = doc.createElement(name), attr; |
||||||
|
|
||||||
|
for (attr in attrs) { |
||||||
|
if (attrs.hasOwnProperty(attr)) { |
||||||
|
node.setAttribute(attr, attrs[attr]); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return node; |
||||||
|
} |
||||||
|
|
||||||
|
function finish(type) { |
||||||
|
var p = pending[type], |
||||||
|
callback, |
||||||
|
urls; |
||||||
|
|
||||||
|
if (p) { |
||||||
|
callback = p.callback; |
||||||
|
urls = p.urls; |
||||||
|
urls.shift(); |
||||||
|
pollCount = 0; |
||||||
|
if (!urls.length) { |
||||||
|
callback && callback.call(p.context, p.obj); |
||||||
|
pending[type] = null; |
||||||
|
queue[type].length && load(type); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function getEnv() { |
||||||
|
var ua = navigator.userAgent; |
||||||
|
|
||||||
|
env = { |
||||||
|
|
||||||
|
async: doc.createElement('script').async === true |
||||||
|
}; |
||||||
|
|
||||||
|
(env.webkit = /AppleWebKit\//.test(ua)) |
||||||
|
|| (env.ie = /MSIE/.test(ua)) |
||||||
|
|| (env.opera = /Opera/.test(ua)) |
||||||
|
|| (env.gecko = /Gecko\//.test(ua)) |
||||||
|
|| (env.unknown = true); |
||||||
|
} |
||||||
|
|
||||||
|
function load(type, urls, callback, obj, context) { |
||||||
|
var _finish = function () { finish(type); }, |
||||||
|
isCSS = type === 'css', |
||||||
|
nodes = [], |
||||||
|
i, len, node, p, pendingUrls, url; |
||||||
|
|
||||||
|
env || getEnv(); |
||||||
|
|
||||||
|
if (urls) { |
||||||
|
|
||||||
|
urls = typeof urls === 'string' ? [urls] : urls.concat(); |
||||||
|
|
||||||
|
if (isCSS || env.async || env.gecko || env.opera) { |
||||||
|
|
||||||
|
queue[type].push({ |
||||||
|
urls : urls, |
||||||
|
callback: callback, |
||||||
|
obj : obj, |
||||||
|
context : context |
||||||
|
}); |
||||||
|
} else { |
||||||
|
for (i = 0, len = urls.length; i < len; ++i) { |
||||||
|
queue[type].push({ |
||||||
|
urls : [urls[i]], |
||||||
|
callback: i === len - 1 ? callback : null, |
||||||
|
obj : obj, |
||||||
|
context : context |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (pending[type] || !(p = pending[type] = queue[type].shift())) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
head || (head = doc.head || doc.getElementsByTagName('head')[0]); |
||||||
|
pendingUrls = p.urls; |
||||||
|
|
||||||
|
for (i = 0, len = pendingUrls.length; i < len; ++i) { |
||||||
|
url = pendingUrls[i]; |
||||||
|
|
||||||
|
if (isCSS) { |
||||||
|
node = env.gecko ? createNode('style') : createNode('link', { |
||||||
|
href: url, |
||||||
|
rel : 'stylesheet' |
||||||
|
}); |
||||||
|
} else { |
||||||
|
node = createNode('script', {src: url}); |
||||||
|
node.async = false; |
||||||
|
} |
||||||
|
|
||||||
|
node.className = 'lazyload'; |
||||||
|
node.setAttribute('charset', 'utf-8'); |
||||||
|
|
||||||
|
if (env.ie && !isCSS) { |
||||||
|
node.onreadystatechange = function () { |
||||||
|
if (/loaded|complete/.test(node.readyState)) { |
||||||
|
node.onreadystatechange = null; |
||||||
|
_finish(); |
||||||
|
} |
||||||
|
}; |
||||||
|
} else if (isCSS && (env.gecko || env.webkit)) { |
||||||
|
if (env.webkit) { |
||||||
|
p.urls[i] = node.href;
|
||||||
|
pollWebKit(); |
||||||
|
} else { |
||||||
|
node.innerHTML = '@import "' + url + '";'; |
||||||
|
pollGecko(node); |
||||||
|
} |
||||||
|
} else { |
||||||
|
node.onload = node.onerror = _finish; |
||||||
|
} |
||||||
|
|
||||||
|
nodes.push(node); |
||||||
|
} |
||||||
|
|
||||||
|
for (i = 0, len = nodes.length; i < len; ++i) { |
||||||
|
head.appendChild(nodes[i]); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function pollGecko(node) { |
||||||
|
var hasRules; |
||||||
|
|
||||||
|
try { |
||||||
|
|
||||||
|
hasRules = !!node.sheet.cssRules; |
||||||
|
} catch (ex) { |
||||||
|
pollCount += 1; |
||||||
|
|
||||||
|
if (pollCount < 200) { |
||||||
|
setTimeout(function () { pollGecko(node); }, 50); |
||||||
|
} else { |
||||||
|
|
||||||
|
hasRules && finish('css'); |
||||||
|
} |
||||||
|
|
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
finish('css'); |
||||||
|
} |
||||||
|
|
||||||
|
function pollWebKit() { |
||||||
|
var css = pending.css, i; |
||||||
|
|
||||||
|
if (css) { |
||||||
|
i = styleSheets.length; |
||||||
|
|
||||||
|
while (--i >= 0) { |
||||||
|
if (styleSheets[i].href === css.urls[0]) { |
||||||
|
finish('css'); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
pollCount += 1; |
||||||
|
|
||||||
|
if (css) { |
||||||
|
if (pollCount < 200) { |
||||||
|
setTimeout(pollWebKit, 50); |
||||||
|
} else { |
||||||
|
|
||||||
|
finish('css'); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return { |
||||||
|
|
||||||
|
css: function (urls, callback, obj, context) { |
||||||
|
if (isLoaded(urls)) { |
||||||
|
return callback; |
||||||
|
} else { |
||||||
|
load('css', urls, callback, obj, context); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
js: function (urls, callback, obj, context) { |
||||||
|
if (isLoaded(urls)) { |
||||||
|
return callback; |
||||||
|
} else { |
||||||
|
load('js', urls, callback, obj, context); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
})(this.document); |
||||||
|
} |
||||||
|
|
Loading…
Reference in new issue