(function(global){
|
//load js, css files
|
function loadResources(ress, onOneBeginLoad, onOneLoad, onLoad){
|
var loaded = [];
|
function _onOneLoad(url){
|
//to avoid trigger onload more then one time
|
if(checkHaveLoaded(url)){
|
return;
|
}
|
loaded.push(url);
|
if(onOneLoad){
|
onOneLoad(url, loaded.length);
|
}
|
if(loaded.length === ress.length){
|
if(onLoad){
|
onLoad();
|
}
|
}
|
}
|
|
for(var i = 0; i < ress.length; i ++){
|
loadResource(ress[i], onOneBeginLoad, _onOneLoad);
|
}
|
|
function checkHaveLoaded(url){
|
for(var i = 0; i < loaded.length; i ++){
|
if(loaded[i] === url){
|
return true;
|
}
|
}
|
return false;
|
}
|
}
|
function getExtension(url) {
|
url = url || "";
|
var items = url.split("?")[0].split(".");
|
return items[items.length-1].toLowerCase();
|
}
|
function loadResource(url, onBeginLoad, onLoad){
|
if(onBeginLoad){
|
onBeginLoad(url);
|
}
|
var type = getExtension(url);
|
if(type.toLowerCase() === 'css'){
|
loadCss(url);
|
}else{
|
loadJs(url);
|
}
|
function createElement(config) {
|
var e = document.createElement(config.element);
|
for (var i in config) {
|
if (i !== 'element' && i !== 'appendTo') {
|
e[i] = config[i];
|
}
|
}
|
var root = document.getElementsByTagName(config.appendTo)[0];
|
return (typeof root.appendChild(e) === 'object');
|
}
|
|
function loadCss(url) {
|
var result = createElement({
|
element: 'link',
|
rel: 'stylesheet',
|
type: 'text/css',
|
href: url,
|
onload: function(){
|
elementLoaded(url);
|
},
|
appendTo: 'head'
|
});
|
//for the browser which doesn't fire load event
|
//safari update documents.stylesheets when style is loaded.
|
var ti = setInterval(function() {
|
var styles = document.styleSheets;
|
for(var i = 0; i < styles.length; i ++){
|
// console.log(styles[i].href);
|
if(styles[i].href &&
|
styles[i].href.substr(styles[i].href.indexOf(url), styles[i].href.length) === url){
|
clearInterval(ti);
|
elementLoaded(url);
|
}
|
}
|
}, 500);
|
return (result);
|
}
|
|
function loadJs(url) {
|
var result = createElement({
|
element: 'script',
|
type: 'text/javascript',
|
onload: function(){
|
elementLoaded(url);
|
},
|
onreadystatechange: function(){
|
elementReadyStateChanged(url, this);
|
},
|
src: url,
|
appendTo: 'body'
|
});
|
return (result);
|
}
|
function elementLoaded(url){
|
if(onLoad){
|
onLoad(url);
|
}
|
}
|
function elementReadyStateChanged(url, thisObj){
|
if (thisObj.readyState === 'loaded' || thisObj.readyState === 'complete') {
|
elementLoaded(url);
|
}
|
}
|
}
|
/***********
|
testLoad({
|
test: window.console,
|
success
|
})
|
************/
|
function testLoad(testObj){
|
testObj.success = !!testObj.success? isArray(testObj.success)?
|
testObj.success: [testObj.success]: [];
|
testObj.failure = !!testObj.failure?
|
isArray(testObj.failure)? testObj.failure: [testObj.failure]: [];
|
|
if(testObj.test && testObj.success.length > 0){
|
loadResources(testObj.success, null, null, testObj.callback);
|
}else if(!testObj.test && testObj.failure.length > 0){
|
loadResources(testObj.failure, null, null, testObj.callback);
|
}else{
|
testObj.callback();
|
}
|
}
|
/* A must read: http://bonsaiden.github.com/JavaScript-Garden
|
************************************************************/
|
function is(type, obj) {
|
var clas = Object.prototype.toString.call(obj).slice(8, -1);
|
return obj !== undefined && obj !== null && clas === type;
|
}
|
|
function isArray(item) {
|
return is("Array", item);
|
}
|
|
global.loadResources = loadResources;
|
global.loadResource = loadResource;
|
global.testLoad = testLoad;
|
}
|
)(window);
|