动态加载javascript文件

动态加载javascript文件,javascript,jquery,Javascript,Jquery,我正在尝试动态加载js文件列表。目前一切正常。唯一的问题是我在循环中编写了func,所以代码会重复很多次。我要做的是循环下载文件,然后确认它们已经加载并执行了我的func() 对于我的代码,如果我在循环外部写入func(),我会收到一条错误消息。表示在onreadystate等外部收到错误消息 function( libs, func ){ if( typeof func === 'function' ) { libs.forEa

我正在尝试动态加载js文件列表。目前一切正常。唯一的问题是我在循环中编写了func,所以代码会重复很多次。我要做的是循环下载文件,然后确认它们已经加载并执行了我的
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删除脚本(如果存在)以避免重复