无法从动态加载的javascript文件调用函数
我正在从文档中的另一个javascript文件加载一个javascript外部文件,由于它已加载,我想从加载的js文件调用一个函数。 以下是加载函数:无法从动态加载的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 =
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()
。