无法从动态加载的javascript文件调用函数

无法从动态加载的javascript文件调用函数,javascript,html,dom,Javascript,Html,Dom,我正在从文档中的另一个javascript文件加载一个javascript外部文件,由于它已加载,我想从加载的js文件调用一个函数。 以下是加载函数: function loadScript(url) { var head = window.top.document.getElementsByTagName('head')[0]; var script = window.top.document.createElement('script'); script.src =

我正在从文档中的另一个javascript文件加载一个javascript外部文件,由于它已加载,我想从加载的js文件调用一个函数。 以下是加载函数:

function loadScript(url) {
    var head = window.top.document.getElementsByTagName('head')[0];
    var script = window.top.document.createElement('script');
    script.src = url;
    script.type= "text/javascript";
    head.appendChild(script);
    if(script.readyState) {  //IE
        script.onreadystatechange = function() {
            if ( script.readyState === "loaded" || script.readyState === "complete" ) {
                script.onreadystatechange = null;
                console.log("[BANDEAU] script loaded");
                testAlert();
            }
        };
    } else {  //Others
        script.onload = function() {
            console.log("[BANDEAU] script loaded");
            testAlert();
        };
    }
}
因此,它工作得很好,因为javascript文件已成功加载,但我无法从加载的javascript文件访问
testAlert()
方法,正如我在上面的代码中尝试的那样,在打印脚本已加载之后。当我试图在
窗口[testAlert]
上使用
typeOf
获取函数类型时,我得到一个未定义的值。但是,当我尝试在开发人员控制台中执行
testAlert()
方法时,它工作得非常好。有人知道我做错了什么吗


调用方javascript文件和加载的javascript文件之间在DOM中的位置可能是原因吗

在更改src之前,需要分配加载处理程序

函数加载脚本(url){
var head=document.getElementsByTagName('head')[0];//frames/iFrames中的window.top
var script=document.createElement('script');
script.type=“text/javascript”;
if(script.readyState){//IE
script.onreadystatechange=函数(){
如果(script.readyState==“已加载”| | script.readyState===“完成”){
script.onreadystatechange=null;
log(“[BANDEAU]脚本加载”);
testAlert();//window.top.testAlert()如果需要
}
};
}
否则{
script.onload=函数(){
log(“[BANDEAU]脚本加载”);
testAlert();//window.top.testAlert()如果需要
};
}
script.src=url;
head.appendChild(脚本);
}

在更改src之前,您需要分配加载处理程序

函数加载脚本(url){
var head=document.getElementsByTagName('head')[0];//frames/iFrames中的window.top
var script=document.createElement('script');
script.type=“text/javascript”;
if(script.readyState){//IE
script.onreadystatechange=函数(){
如果(script.readyState==“已加载”| | script.readyState===“完成”){
script.onreadystatechange=null;
log(“[BANDEAU]脚本加载”);
testAlert();//window.top.testAlert()如果需要
}
};
}
否则{
script.onload=函数(){
log(“[BANDEAU]脚本加载”);
testAlert();//window.top.testAlert()如果需要
};
}
script.src=url;
head.appendChild(脚本);
}

除了mplungjan所说的之外,我非常确定您必须对加载的脚本执行eval(),以便为调用testAlert()找到一个合法的地址


另外,请查看更多信息。

除了mplungjan所说的之外,我非常确定您必须对加载的脚本执行eval(),才能获得调用testAlert()的合法地址


另外,请查看更多信息。

为什么要将脚本附加到
window.top
而不是
window
?换句话说,当代码运行时,
window
是否与
window.top
相同?如果它们不同,那就是你的问题。为什么要将脚本附加到
window.top
而不是
window
?换句话说,当代码运行时,
window
是否与
window.top
相同?如果它们不同,那就是你的问题。请记住eval()是危险的,所以我不推荐它作为长期解决方案。我提供的链接提供了更成熟(更安全)的解决方案。这是不真实的。OP正在创建一个
标记并将其附加到文档中;
标记的正常行为是浏览器加载代码并运行它。True。父级确实运行代码,但
loadScript()
函数不会自动接收指向
testAlert()的指针。但我在上面的评论中看到了你的答案,这完全有效;使用
window.parent.testAlert()
引用
testAlert()
。这比我使用eval()的想法好多了。谢谢大家的回答。问题是我在iFrame中调用了该函数,juts注意到了这一点,所以我需要在父指针上调用该函数。请记住eval()是危险的,所以我不建议将其作为长期解决方案。我提供的链接提供了更成熟(更安全)的解决方案。这是不真实的。OP正在创建一个
标记并将其附加到文档中;
标记的正常行为是浏览器加载代码并运行它。True。父级确实运行代码,但
loadScript()
函数不会自动接收指向
testAlert()的指针。但我在上面的评论中看到了你的答案,这完全有效;使用
window.parent.testAlert()
引用
testAlert()
。这比我使用eval()的想法好多了。谢谢大家的回答。问题是我在iFrame中调用了该函数,juts注意到了这一点,所以我需要在父指针上调用该函数。@HubertSolecki您是从
还是什么加载该文件?@Pointy是。。。我只是注意到。。。。只需要在我的testAlert函数之前添加parent关键字…@HubertSolecki right,
window.parent.testAlert()
window.top.testAlert()
@HubertSolecki您是从
或其他地方加载该文件的吗?@Pointy是的。。。我只是注意到。。。。只需要在testAlert函数前面添加parent关键字…@HubertSolecki right,
window.parent.testAlert()
window.top.testAlert()