var ScriptLoader = { ???worker: 0, ???isWait: false, ???readyQueue: [], ???callback: [], ???timer: null, ???wait: function () { ???????if (!this._isComplateTask()) { ???????????this.isWait = true; ???????????this.readyQueue.unshift(‘wait‘); ???????} ???????//console.log(‘wait is true‘); ???????return this; ???}, ???_isComplateTask: function () { ???????return this.worker === 0; ???}, ???loadJs: function (url, async, callback) { ???????console.log(‘load js ‘ + url); ???????if (this.isWait) { ???????????// 将js加载到队列 ???????????this.readyQueue.unshift(url); ???????????this.callback.unshift(callback); ???????????if (!this.timer) { ???????????// 定时处理队列 ???????????????var that = this; ???????????????this.timer = setInterval(function () { ???????????????????if (that.readyQueue.length === 0) { ???????????????????// 队列消费完, 清除定时器 ???????????????????????clearInterval(that.timer); ???????????????????????that.timer = null; ???????????????????} else if (that._isComplateTask()) { ???????????????????????that._loadReady(); ???????????????????} ???????????????}, 50); ???????????} ???????} else { ???????????this._realLoad(url, async, callback); ???????} ???????return this; ???}, ???/** ????* 消费队列 ????*/ ???_loadReady: function () { ???????var url; ???????while (this.readyQueue.length > 0) { ???????????url = this.readyQueue.pop(); ???????????if (url === ‘wait‘) { ???????????????if (!this._isComplateTask()) { ???????????????????this.isWait = true; ???????????????????break; ???????????????} ???????????} else { ???????????????this._realLoad(url, true, this.callback.pop()); ???????????} ???????} ???}, ???_realLoad: function (url, async, callback) { ???????this.worker++; ???????var that = this; ???????console.log(‘start load js ‘ + url); ???????this._loadJsFile(url, function () { ???????????that.worker--; ???????????if (that.worker === 0) { ???????????????//console.log(‘wait is false‘); ???????????????that.isWait = false; ???????????} ???????????if(callback){ ???????????????callback(); ???????????} ???????}, async); ???}, ???_loadJsFile: function (file, callback, async) { ???????var head, d = document; ???????((head = d.getElementsByTagName(‘head‘)[0]) || (head = d.body.parentNode.appendChild(d.createElement("head")))); ???????var script = d.createElement("script"); ???????script.type = "text/javascript"; ???????script.src = file; ???????script.charset = ‘UTF-8‘; ???????if (async) { ???????????script.async = true; ???????} ???????if (script.readyState) {//IE ???????????script.onreadystatechange = function () { ???????????????if (script.readyState === "loaded" || script.readyState === "complete") { ???????????????????script.onreadystatechange = null; ???????????????????callback(); ???????????????} ???????????}; ???????} else {//其他浏览器 ???????????script.onload = function () { ???????????????callback(); ???????????}; ???????} ???????head.appendChild(script); ???}};
动态导入Js文件
原文地址:https://www.cnblogs.com/sky-net/p/10030350.html