UNPKG

application-prototype

Version:
225 lines (201 loc) 4.93 kB
/* jshint -W002 */ /* jshint -W084 */ /** @module uriLoad */ var callbackOnce = function (cb) { var executed = false; return function (a, b) { if (executed) { console.log('callbackOnce', a, b); return; } executed = true; cb(a,b); }; }; /** * loadScript - is a function for adding scripts into the header * @alias module:uriLoad.script * @param {string|string[]} url url/urls of scripts * @param {Function} callback [description] * @param {object} opts settings with info related to the script tags */ function loadScript(url, callback, opts, document){ if (!document) document = window.document; if (!callback) callback = function () {}; callback = callbackOnce(callback); // TODO fix trick if (!Array.isArray(url)) { url = [url]; } if (!opts) { opts = { attr : { "type" : "text/javascript", "charset" : "utf-8" } }; } var waitScripts = 1; var waitScriptsChecker = function () { waitScripts -= 1; if (waitScripts === 0) { callback(); } }; url.forEach(function (source) { var script; if (script = document.querySelector('script[src="'+source+'"]')) { if (!script.loaded) { waitScripts += 1; if (!script.callbacks) script.callbacks = []; script.callbacks.push(waitScriptsChecker); } } else { waitScripts += 1; script = document.createElement("script"); script.type = "text/javascript"; if (opts && "attr" in opts) { var at; for (at in opts.attr) { script.setAttribute(at, opts.attr[at]); } } script.callbacks = []; script.callbacks.push(callback); var runCallBacks = function () { var queue = script.callbacks; script.callbacks = []; queue.forEach(function (f) { var er; try { f(); } catch (er) { console.error(er); } }); }; if (script.readyState){ //IE script.onreadystatechange = function(){ if (script.readyState == "loaded" || script.readyState == "complete"){ script.onreadystatechange = null; script.loaded = true; runCallBacks(); } }; } else { //Others script.onload = function(){ script.loaded = true; runCallBacks(); }; } script.src = source; document.getElementsByTagName("head")[0].appendChild(script); } }); waitScriptsChecker(); } /** * loadLink - is a function for adding link tags into the header * @alias module:uriLoad.link * @param {string|string[]} url url/urls of link tags * @param {Function} callback [description] * @param {object} opts settings with info related to the link tags */ function loadLink(url, callback, opts, document){ if (!document) document = window.document; if (!callback) callback = function () {}; callback = callbackOnce(callback); // TODO fix trick if (!opts) { opts = { attr : { "rel" : "stylesheet", "type" : "text/css" } }; } if (!Array.isArray(url)) { url = [url]; } var waitLinks = 1; var waitLinksChecker = function () { waitLinks -= 1; if (waitLinks === 0) { callback(); } }; url.forEach(function (source) { var link; if (link = document.querySelector('link[href="'+source+'"]')) { if (!link.loaded) { waitLinks += 1; if (!link.callbacks) link.callbacks = []; link.callbacks.push(waitLinksChecker); } } else { waitLinks += 1; link = document.createElement("link"); if (opts && "attr" in opts) { var at; for (at in opts.attr) { link.setAttribute(at, opts.attr[at]); } } link.callbacks = []; link.callbacks.push(callback); var runCallBacks = function () { var queue = link.callbacks; link.callbacks = []; queue.forEach(function (f) { var er; try { f(); } catch (er) { console.error(er); } }); }; var userAgent = navigator.userAgent, iChromeBrowser = /CriOS|Chrome/.test(userAgent), isAndroidBrowser = /Mozilla\/5.0/.test(userAgent) && /Android/.test(userAgent) && /AppleWebKit/.test(userAgent) && !iChromeBrowser; if (link.readyState){ //IE link.onreadystatechange = function(){ if (link.readyState == "loaded" || link.readyState == "complete"){ link.onreadystatechange = null; if (!link.loaded) { link.loaded = true; runCallBacks(); } } }; } else if (isAndroidBrowser || !("onload" in link)) { if (!link.loaded) { link.loaded = true; runCallBacks(); } } else { link.onload = function() { if (!link.loaded) { link.loaded = true; runCallBacks(); } }; } link.setAttribute("href", source); document.getElementsByTagName("head")[0].appendChild(link); setTimeout(function () { if (!link.loaded) { link.loaded = true; runCallBacks(); } }, 1000); } }); waitLinksChecker(); } module.exports = { script : loadScript, link : loadLink };