本文介绍在 JavaScript 中动态加载 JS 和 CSS 文件的两种简单方式。通过创建 script 或 link 元素并插入 DOM,默认情况下文件为异步加载,可能导致后续代码执行时文件尚未就绪。为解决此问题,文章提供了同步加载的实现思路,确保文件加载完成后再执行相关逻辑,适用于需要依赖外部资源立即生效的场景。
动态加载 JS 与 CSS 文件的基本实现
/*动态添加js或css,URL:文件路径,FileType:文件类型(js/css)*/
function AddJsFiles(URL,FileType){
var oHead = document.getElementsByTagName('HEAD').item(0);
var addheadfile;
if(FileType=="js"){
addheadfile= document.createElement("script");
addheadfile.type = "text/javascript";
addheadfile.src=URL;
}else{
addheadfile= document.createElement("link");
addheadfile.type = "text/css";
addheadfile.rel="stylesheet";
addheadfile.rev = "stylesheet";
addheadfile.media = "screen";
addheadfile.href=URL;
}
oHead.appendChild( addheadfile);
}
/*方法调用*/
AddJsFiles("js/index.js","js");
AddJsFiles("css/index.css","css");
异步加载的潜在问题
经测试发现,上述方法在加载文件时采用的是异步加载机制。这种机制可能导致在文件加载完成后立即调用其中定义的方法或变量时,因资源尚未完全就绪而引发错误。
因此,以下介绍一种同步加载的方法。该方法确保在文件完全加载完成后,再执行相应的代码或调用相关方法,从而避免异步加载带来的时序问题。
同步加载的实现方案
/*5.加载文件*/
/* 已加载文件缓存列表,用于判断文件是否已加载过,若已加载则不再次加载*/
var classcodes =[];
window.Import={
/*加载一批文件,_files:文件路径数组,可包括js,css,less文件,succes:加载成功回调函数*/
LoadFileList:function(_files,succes){
var FileArray=[];
if(typeof _files==="object"){
FileArray=_files;
}else{
/*如果文件列表是字符串,则用,切分成数组*/
if(typeof _files==="string"){
FileArray=_files.split(",");
}
}
if(FileArray!=null && FileArray.length>0){
var LoadedCount=0;
for(var i=0;i< FileArray.length;i++){
loadFile(FileArray[i],function(){
LoadedCount++;
if(LoadedCount==FileArray.length){
succes();
}
})
}
}
/*加载JS文件,url:文件路径,success:加载成功回调函数*/
function loadFile(url, success) {
if (!FileIsExt(classcodes,url)) {
var ThisType=GetFileType(url);
var fileObj=null;
if(ThisType==".js"){
fileObj=document.createElement('script');
fileObj.src = url;
}else if(ThisType==".css"){
fileObj=document.createElement('link');
fileObj.href = url;
fileObj.type = "text/css";
fileObj.rel="stylesheet";
}else if(ThisType==".less"){
fileObj=document.createElement('link');
fileObj.href = url;
fileObj.type = "text/css";
fileObj.rel="stylesheet/less";
}
success = success || function(){};
fileObj.onload = fileObj.onreadystatechange = function() {
if (!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState) {
success();
classcodes.push(url)
}
}
document.getElementsByTagName('head')[0].appendChild(fileObj);
}else{
success();
}
}
/*获取文件类型,后缀名,小写*/
function GetFileType(url){
if(url!=null && url.length>0){
return url.substr(url.lastIndexOf(".")).toLowerCase();
}
return "";
}
/*文件是否已加载*/
function FileIsExt(FileArray,_url){
if(FileArray!=null && FileArray.length>0){
var len =FileArray.length;
for (var i = 0; i < len; i++) {
if (FileArray[i] ==_url) {
return true;
}
}
}
return false;
}
}
}
var FilesArray=["js/index.js","js/ClassInherit1.js","js/highcharts_2.21.js","css/index.css"];
Import.LoadFileList(FilesArray,function(){
/*这里写加载完成后需要执行的代码或方法*/
});
以上就是小编为大家带来的JS 动态加载js文件和css文件 同步/异步的两种简单方式的全部内容了,希望对大家有所帮助,多多支持本站~