JS實現完美include加載功能代碼
2024-09-06 12:41:25
供稿:網友
js為什么需要include?讓我們想想這樣1個場景,a.js 需要用到1個公用的common.js,當然你可以在用到a.js的頁面使用<script src="common.js">,但假設有5個頁面用到了a.js,你是不是要寫5遍<script。而且要是以后a.js 又需要引用common2.js,你是不是又的修改5個頁面了?
已有js include的一些問題
在寫這個之前在網上搜索了些資料,發現以前寫的include都存在2個問題,這也是include需要解決的比較重要的2個問題。
1、相對路徑的問題: 在a.js中使用include("../js/common.js"); include 函數中肯定是使用相對路徑,是相對a.js的路徑。而a.js在html中使用<script>嵌入有可能是相對路徑,有可能是絕對路徑。 include函數如何才能真正確定common.js的絕對路徑,或者是相對html的相對路徑。網上一些為了解決這個問題,還需要加一些js變量,不方便。
2、引用的問題。 網上include函數的實現幾乎都是使用下面2種方式插入common.js
document.write("<script src='" + .. + "></script>")
或者
var s = document.createElement("script");
s.src = ...;
head.insertAfter(s,...);
document.write 輸出的腳本會在a.js后面加載,而createElement("script")創建的腳本是非阻塞加載。 所以如果在common.js加載完畢之前,a.js中調用了common.js的函數就會報錯。
實現
解決上面2個問題,就可以實現js include。
第1個問題,我的方法是先獲取到a.js在html中的絕對路徑(如果是相對路徑,就轉為絕對路徑),然后再把common.js的路徑轉為絕對路徑。
第2個問題,采用同步的ajax來請求common.js,這樣就不會出現引用問題。
實現代碼如下:
代碼如下:
// 根據相對路徑獲取絕對路徑
function getPath(relativePath,absolutePath){
var reg = new RegExp("http://.//./","g");
var uplayCount = 0; // 相對路徑中返回上層的次數。
var m = relativePath.match(reg);
if(m) uplayCount = m.length;
var lastIndex = absolutePath.length-1;
for(var i=0;i<=uplayCount;i++){
lastIndex = absolutePath.lastIndexOf("/",lastIndex);
}
return absolutePath.substr(0,lastIndex+1) + relativePath.replace(reg,"");
}
function include(jssrc){
// 先獲取當前a.js的src。a.js中調用include,直接獲取最后1個script標簽就是a.js的引用。
var scripts = document.getElementsByTagName("script");
var lastScript = scripts[scripts.length-1];
var src = lastScript.src;
if(src.indexOf("http://")!=0 && src.indexOf("/") !=0){
// a.js使用相對路徑,先替換成絕對路徑
var url = location.href;
var index = url.indexOf("?");
if(index != -1){
url = url.substring(0, index-1);
}
src = getPath(src,url);
}
var jssrcs = jssrc.split("|"); // 可以include多個js,用|隔開