动态加载javascript文件
我正在尝试动态加载js文件列表。目前一切正常。唯一的问题是我在循环中编写了func,所以代码会重复很多次。我要做的是循环下载文件,然后确认它们已经加载并执行了我的动态加载javascript文件,javascript,jquery,Javascript,Jquery,我正在尝试动态加载js文件列表。目前一切正常。唯一的问题是我在循环中编写了func,所以代码会重复很多次。我要做的是循环下载文件,然后确认它们已经加载并执行了我的func() 对于我的代码,如果我在循环外部写入func(),我会收到一条错误消息。表示在onreadystate等外部收到错误消息 function( libs, func ){ if( typeof func === 'function' ) { libs.forEa
func()
对于我的代码,如果我在循环外部写入func()
,我会收到一条错误消息。表示在onreadystate等外部收到错误消息
function( libs, func ){
if( typeof func === 'function' ) {
libs.forEach( function( fileName ) {
var script = document.createElement('script');
var head = (document.getElementsByTagName("head")[0] || document.documentElement);
script.setAttribute("type", "text/javascript");
if (script.readyState){ //IE
script.onreadystatechange = function(){
if (script.readyState == "loaded" || script.readyState == "complete") {
script.onreadystatechange = null;
head.remove( script );
func();
}
};
} else { //Others browsers
script.onload = function(){
head.remove( script );
loaded = true;
func();
};
}
script.setAttribute("src", fileName);
head.appendChild( script );
});
}
}
您真的需要通过自己的函数加载它吗?为什么不使用像requirejs这样的脚本加载程序呢
在这里您可以找到其他:我不确定自己是否理解正确,但您想在下载所有文件后执行您的功能吗?最常见的方法是设置计数器。我在做类似的事情时使用了这个函数,这个函数可以在每次文件加载后执行,也可以在所有文件加载时执行 我使用以下函数跟踪加载的文件数
function loadJs(files, perFileCallback, doneCallback){
var numFiles = files.length,
numFilesLoaded = 0,
loadedFiles = [],
fileOrder = {};
if(numFiles === 0){
doneCallback([]);
return;
}
function _loadFileCallback (file, fileName) {
numFilesLoaded++;
loadedFiles[fileOrder[fileName]] = file; // Must be placed in correct order.
perFileCallback(numFilesLoaded);
if (numFiles === numFilesLoaded && perFileCallback) {
doneCallback(loadedFiles);
}
}
for (var i = 0; i < files.length; i++) {
fileOrder[files[i]] = i;
_loadFile(files[i], _loadFileCallback); // Load the file with ajax and perform _loadFileCallback when done.
}
}
函数loadJs(文件、perFileCallback、doneCallback){
var numFiles=files.length,
numFilesLoaded=0,
loadedFiles=[],
fileOrder={};
如果(numFiles==0){
doneCallback([]);
返回;
}
函数_loadFileCallback(文件,文件名){
numFilesLoaded++;
loadedFiles[fileOrder[fileName]]=file;//必须按正确的顺序放置。
perFileCallback(numFilesLoaded);
if(numFiles===numFilesLoaded&&perFileCallback){
doneCallback(已加载的文件);
}
}
对于(var i=0;i
您还可以看到我链接在上使用它的所有三个函数
它使用jQuery,但如果需要,可以用普通的ajax调用来交换它
这还考虑到,在向头部添加文件时,您会按照正确的顺序进行操作。这是因为我有一个文件定义了var-app,还有一个文件定义了app.mySite,在创建app.mySite之前定义app是至关重要的。是的,完全正确,仅此一个。这是一个小函数,我不想搜索10个库和它们的文档,我的意思是这是我可以做的小事情。你为什么要做
head.remove(脚本)代码>?您是否理解加载文件是异步的,因此您需要等待readystate。我不清楚。你能提供一个有用的例子吗?readystate以确保文件已经加载。head.remove删除脚本(如果存在)以避免重复