/**
* require
* @author Heekei
* @version 0.2.1
*
* @description 異步加載外部js,可回調(diào)
* @param {Object} setting 配置項(xiàng)
* @param {Object=} setting.depends 依賴文件數(shù)組,可選
* @param {String} setting.url 外部js地址
* @param {Function=} setting.callback 回調(diào)函數(shù),可選
* @param {Boolean=} setting.defer 是否在DomContentLoaded之前運(yùn)行,默認(rèn)為false(注:如果depends具有強(qiáng)依賴性,請(qǐng)將defer設(shè)置為true)
*/
var require = function (setting) {
var _this = this;
if (require.loaded.indexOf(setting.url) !== -1) return;
require[setting.url] = {};
require[setting.url].Timer = null;
// 加載依賴文件
if (setting.depends) {
// 標(biāo)記依賴文件正在加載
require[setting.url].dependsLoading = true;
// 檢查依賴文件是否已經(jīng)加載過(guò)
for (var x in setting.depends) {
if (require.loaded.indexOf(setting.depends[x]) !== -1) {
setting.depends.splice(x, 1)
}
}
// 記錄正在加載的依賴到數(shù)組【加載中的依賴】
require[setting.url].loadingDepends = setting.depends;
// 設(shè)置主JS的依賴文件的長(zhǎng)度
require[setting.url].dLen = setting.depends.length;
// 定時(shí)檢查依賴是否加載完畢
require[setting.url].Timer = setInterval(function () {
if (require[setting.url].dependsLoading === false) { // 依賴文件加載完畢
// 加載主JS
require({
url: setting.url,
callback: setting.callback
})
clearInterval(require[setting.url].Timer) // 清除定時(shí)器
}
}, 0)
// 循環(huán)加載依賴文件
for (var d = 0; d < require[setting.url].dLen; d++) {
require({
url: setting.depends[d],
callback: function () {
// 加載完成后,將該依賴文件從【加載中的依賴】數(shù)組中刪除
require[setting.url].loadingDepends.splice(require[setting.url].loadingDepends.indexOf(this.url), 1)
// 如果【加載中的依賴】為空,將“依賴加載中”的狀態(tài)標(biāo)記為false
if (require[setting.url].loadingDepends.length == 0) require[setting.url].dependsLoading = false;
}
})
}
// 退出函數(shù),保證主JS在加載依賴文件的過(guò)程中不進(jìn)行加載
return;
}
var script = document.createElement("script"); // 加載JS文件
// 觸發(fā)回調(diào)
if (script.readyState) { //IE
script.onreadystatechange = function () {
if (script.readyState == "loaded" ||
script.readyState == "complete") {
script.onreadystatechange = null;
console.log(setting.url + " has loaded");
isLoaded = true;
if (typeof setting.callback === "function") {
setting.callback();
}
}
};
} else { //Others
script.onload = function () {
console.log(setting.url + " has loaded");
if (typeof setting.callback === "function") {
setting.callback();
}
};
}
script.src = setting.url + "?" + Math.random();
if (setting.defer) {
script.defer = "defer";
}
require.loaded.push(setting.url);
document.head.appendChild(script);
}
require.loaded = []
JavaScript requirejs方法的實(shí)現(xiàn)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 定義公共模塊類app,實(shí)現(xiàn)方法的復(fù)用 html: main.js: app.js: demo.js:
- ios js 交互分為兩塊: 1.oc調(diào)用js 這一塊實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,我的項(xiàng)目中加載的是本地的html,js,c...
- JavaScript 模塊化編程(一):模塊的寫(xiě)法JavaScript 模塊化編程(二):規(guī)范JavaScript...
- 陽(yáng)光透過(guò)窗戶 灑滿一面墻 卻無(wú)論如何 也 照不進(jìn)我的心房 躺在沙發(fā)上 猶如 等待死亡 空調(diào)的熱風(fēng)在耳邊呼嘯 我緊閉...