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