123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- /*
- -----------------------------------------------------------
- dom.loadScript.js : 0.1.4 : 2014/02/12 : http://mudcu.be
- -----------------------------------------------------------
- Copyright 2011-2014 Mudcube. All rights reserved.
- -----------------------------------------------------------
- /// No verification
- dom.loadScript.add("../js/jszip/jszip.js");
- /// Strict loading order and verification.
- dom.loadScript.add({
- strictOrder: true,
- urls: [
- {
- url: "../js/jszip/jszip.js",
- verify: "JSZip",
- onsuccess: function() {
- console.log(1)
- }
- },
- {
- url: "../inc/downloadify/js/swfobject.js",
- verify: "swfobject",
- onsuccess: function() {
- console.log(2)
- }
- }
- ],
- onsuccess: function() {
- console.log(3)
- }
- });
- /// Just verification.
- dom.loadScript.add({
- url: "../js/jszip/jszip.js",
- verify: "JSZip",
- onsuccess: function() {
- console.log(1)
- }
- });
- */
- if (typeof(dom) === "undefined") var dom = {};
- (function() { "use strict";
- dom.loadScript = function() {
- this.loaded = {};
- this.loading = {};
- return this;
- };
- dom.loadScript.prototype.add = function(config) {
- var that = this;
- if (typeof(config) === "string") {
- config = { url: config };
- }
- var urls = config.urls;
- if (typeof(urls) === "undefined") {
- urls = [{
- url: config.url,
- verify: config.verify
- }];
- }
- /// adding the elements to the head
- var doc = document.getElementsByTagName("head")[0];
- ///
- var testElement = function(element, test) {
- if (that.loaded[element.url]) return;
- if (test && globalExists(test) === false) return;
- that.loaded[element.url] = true;
- //
- if (that.loading[element.url]) that.loading[element.url]();
- delete that.loading[element.url];
- //
- if (element.onsuccess) element.onsuccess();
- if (typeof(getNext) !== "undefined") getNext();
- };
- ///
- var hasError = false;
- var batchTest = [];
- var addElement = function(element) {
- if (typeof(element) === "string") {
- element = {
- url: element,
- verify: config.verify
- };
- }
- if (/([\w\d.\[\]\'\"])$/.test(element.verify)) { // check whether its a variable reference
- var verify = element.test = element.verify;
- if (typeof(verify) === "object") {
- for (var n = 0; n < verify.length; n ++) {
- batchTest.push(verify[n]);
- }
- } else {
- batchTest.push(verify);
- }
- }
- if (that.loaded[element.url]) return;
- var script = document.createElement("script");
- script.onreadystatechange = function() {
- if (this.readyState !== "loaded" && this.readyState !== "complete") return;
- testElement(element);
- };
- script.onload = function() {
- testElement(element);
- };
- script.onerror = function() {
- hasError = true;
- delete that.loading[element.url];
- if (typeof(element.test) === "object") {
- for (var key in element.test) {
- removeTest(element.test[key]);
- }
- } else {
- removeTest(element.test);
- }
- };
- script.setAttribute("type", "text/javascript");
- script.setAttribute("src", element.url);
- doc.appendChild(script);
- that.loading[element.url] = function() {};
- };
- /// checking to see whether everything loaded properly
- var removeTest = function(test) {
- var ret = [];
- for (var n = 0; n < batchTest.length; n ++) {
- if (batchTest[n] === test) continue;
- ret.push(batchTest[n]);
- }
- batchTest = ret;
- };
- var onLoad = function(element) {
- if (element) {
- testElement(element, element.test);
- } else {
- for (var n = 0; n < urls.length; n ++) {
- testElement(urls[n], urls[n].test);
- }
- }
- var istrue = true;
- for (var n = 0; n < batchTest.length; n ++) {
- if (globalExists(batchTest[n]) === false) {
- istrue = false;
- }
- }
- if (!config.strictOrder && istrue) { // finished loading all the requested scripts
- if (hasError) {
- if (config.error) {
- config.error();
- }
- } else if (config.onsuccess) {
- config.onsuccess();
- }
- } else { // keep calling back the function
- setTimeout(function() { //- should get slower over time?
- onLoad(element);
- }, 10);
- }
- };
- /// loading methods; strict ordering or loose ordering
- if (config.strictOrder) {
- var ID = -1;
- var getNext = function() {
- ID ++;
- if (!urls[ID]) { // all elements are loaded
- if (hasError) {
- if (config.error) {
- config.error();
- }
- } else if (config.onsuccess) {
- config.onsuccess();
- }
- } else { // loading new script
- var element = urls[ID];
- var url = element.url;
- if (that.loading[url]) { // already loading from another call (attach to event)
- that.loading[url] = function() {
- if (element.onsuccess) element.onsuccess();
- getNext();
- }
- } else if (!that.loaded[url]) { // create script element
- addElement(element);
- onLoad(element);
- } else { // it's already been successfully loaded
- getNext();
- }
- }
- };
- getNext();
- } else { // loose ordering
- for (var ID = 0; ID < urls.length; ID ++) {
- addElement(urls[ID]);
- onLoad(urls[ID]);
- }
- }
- };
- dom.loadScript = new dom.loadScript();
- var globalExists = function(path, root) {
- try {
- path = path.split('"').join('').split("'").join('').split(']').join('').split('[').join('.');
- var parts = path.split(".");
- var length = parts.length;
- var object = root || window;
- for (var n = 0; n < length; n ++) {
- var key = parts[n];
- if (object[key] == null) {
- return false;
- } else { //
- object = object[key];
- }
- }
- return true;
- } catch(e) {
- return false;
- }
- };
- })();
- /// For NodeJS
- if (typeof (module) !== "undefined" && module.exports) {
- module.exports = dom.loadScript;
- }
|