123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- 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
- }];
- }
-
- 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)) {
- 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() {};
- };
-
- 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) {
- if (hasError) {
- if (config.error) {
- config.error();
- }
- } else if (config.onsuccess) {
- config.onsuccess();
- }
- } else {
- setTimeout(function() {
- onLoad(element);
- }, 10);
- }
- };
-
- if (config.strictOrder) {
- var ID = -1;
- var getNext = function() {
- ID ++;
- if (!urls[ID]) {
- if (hasError) {
- if (config.error) {
- config.error();
- }
- } else if (config.onsuccess) {
- config.onsuccess();
- }
- } else {
- var element = urls[ID];
- var url = element.url;
- if (that.loading[url]) {
- that.loading[url] = function() {
- if (element.onsuccess) element.onsuccess();
- getNext();
- }
- } else if (!that.loaded[url]) {
- addElement(element);
- onLoad(element);
- } else {
- getNext();
- }
- }
- };
- getNext();
- } else {
- 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;
- }
- };
- })();
- if (typeof (module) !== "undefined" && module.exports) {
- module.exports = dom.loadScript;
- }
|