在动态添加的javascript文件中提供访问功能

Access function present in dynamically added javascript file

本文关键字:访问 功能 文件 动态 添加 javascript      更新时间:2023-09-26

我正在添加一些javascript文件。然后我需要使用其中的函数。在firebug的Scripts选项卡中,我可以看到脚本已经添加。函数LoadScript1Function出现在一个脚本中,LoadScript2Function出现在另一个脚本中。但是我得到的错误是:

`ReferenceError: LoadScript1Function is not defined`

下面是我的代码:

function LoadScripts(){
    try{
        var allScripts = document.getElementsByTagName('script');
        for (var x = 0; x < jsPaths.length; x++) {
            if($.inArray(jsPaths[x], allScripts) == -1){
                loadScript(jsPaths[x], null);
            } 
        }
        async(LoadScript1Function, function(){ ; });
        async(LoadScript2Function, function(){ ; });
    }
    catch(e){
        console.log(e);
    }
}
// Load script
function loadScript(url, callback){
    var script = document.createElement("script");
    script.type = "text/javascript";
    if (script.readyState){  //IE
        script.onreadystatechange = function(){
            if (script.readyState == "loaded" ||
                    script.readyState == "complete"){
                script.onreadystatechange = null;
                callback();
            }
        };
    } else {  //Others
        script.onload = function(){
            callback();
        };
    }
    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}
// Async call
function async(fn, callback) {
    setTimeout(function() {
        fn();
        callback();
    }, 0);
}

尝试按照adeneo的建议执行。

loadScript(jsPaths[x], function(){ 
     if(jsPaths[x].indexOf('Script1') != -1){ // script name check in the path
         LoadScript1Function();
     }
});

我可以看到一个问题在你的setTimeout呼叫-超时是0。Javascript通常是单线程的,可以锁定浏览器的其他组件,因此超时0将不允许下载任何内容。你必须增加这些毫秒,并检查脚本是否已经可操作;如果不是,则安排一个新的超时。虽然我不明白为什么首先需要异步函数

在类似的情况下,我喜欢做的是尝试访问由事物提供的属性或函数,然后等待更多,如果它失败。

我不喜欢回调的一点是,你必须按照平台开发人员所准备的铁道去做,而且对灵活性的任何额外需求都会使你的整个代码脱轨。毕竟,对所有事情都使用setTimeout可能会更好。然后你可以快速处理"丢失的连接",更新任何悸动器/进度条,任何东西。