Javascript 如何知道动态添加的脚本一旦被解析/加载/执行?
我试图动态加载一个JavaScript文件,加载后,运行文件中的一个函数。在我的主要HTML中,我基本上有:Javascript 如何知道动态添加的脚本一旦被解析/加载/执行?,javascript,onload,Javascript,Onload,我试图动态加载一个JavaScript文件,加载后,运行文件中的一个函数。在我的主要HTML中,我基本上有: function load_javascript(js_file) { function load_js_callback(example) { console.log("function " + function_in_js_file + " is " + typeof(function_name)); if (typeof(functi
function load_javascript(js_file)
{
function load_js_callback(example)
{
console.log("function " + function_in_js_file + " is " + typeof(function_name));
if (typeof(function_in_js_file) == "undefined")
{
window.setTimeout(load_js_callback(example), 500);
return false;
}
function_in_js_file(example);
}
var jstag = document.createElement("script");
document.head.appendChild(jstag);
// Browsers:
jstag.onload=load_js_callback("example");
// Internet Explorer:
jstag.onreadystatechange = function() {
if (this.readyState == 'complete') {
load_js_callback("example");
}
}
jstag.setAttribute('src',js_file);
}
load_javascript("/js/example.js");
从我在internet上(和)可以找到的情况来看,这应该是可行的,但是jstag.onload
在定义函数之前运行,所以我需要窗口.setTimeout
再次检查,直到定义函数为止
理想情况下,我想摆脱这个超时。是否有任何方法可以知道文件何时完成加载/解析/执行(我不确定哪个是正确的术语)以及函数的定义,理想情况下不需要更改动态文件?我还尝试过放置
document.head.appendChild(jstag)代码>在jstag.setAttribute之后,但结果相同。尝试定义一个名为
function loadScript(sScriptSrc, oCallback) {
var oHead = document.getElementsByTagName('head')[0];
var oScript = document.createElement('script');
oScript.type = 'text/javascript';
oScript.src = sScriptSrc;
// most browsers
oScript.onload = oCallback;
// IE 6 & 7
oScript.onreadystatechange = function () {
if (this.readyState == 'complete') {
oCallback();
}
}
oHead.appendChild(oScript);
}
然后通过回调调用脚本文件和其中的函数
loadScript("/js/example.js", function () {
//call function
function_in_js_file(example);
});
考虑使用js事件
它在加载脚本之前运行的原因是:
var jstag = document.createElement("script");
document.head.appendChild(jstag);
// Browsers:
jstag.onload=load_js_callback("example");
正在将load_js_callback
的返回值分配给jstag.onload
。onload
处理程序需要一个函数:
var jstag = document.createElement("script");
document.head.appendChild(jstag);
// Browsers:
jstag.onload=function() { load_js_callback("example"); };
正如其他评论中所指出的,所有这些保证都是浏览器已经下载了脚本。你只不过是在他身上,使用这种方法,js保证会被加载,但你不能确定它是否已被执行+Kaddath,谢谢!我就是这么想的。那么我要找的术语已经执行了?你试过这个解决方案了吗?原因是此时它将加载并包含该文件,而其中写入的任何内容都将在包含/加载/执行fike之后执行。@LalitSachdeva我以前已经尝试过了。这个解决方案可以完美地处理小文件。但是,当导入的代码很长,并且您试图在不等待的情况下使用这些代码时,可能会出现未定义的情况。请注意,这主要适用于动态导入。通常,当html页面按照传统方式解析时,你不会遇到这个问题。在阅读了Adam Kewley的答案后,我意识到这与我的答案并不完全相同,因为这是将一个函数分配给onload,而我的代码实际上是分配我的load\u js\u回调
函数的输出,false
或未定义
。所以我仍然不确定onload是否会等待执行。如果您不使用脚本require框架来为您执行,我知道没有js方法来确保您的代码已经执行。当我尝试做一些自定义解决方案时,我在文件的末尾使用了一个var(例如,命名为与文件相同,或带有前缀/后缀)。然后,我测试这个var的存在性,以确保所有变量都被执行,这基本上需要一个超时,就像我在var不存在时所做的那样?是的,或者是一个setInterval。我应该看看browserify是如何处理导入的,如果有这样的检查。。我对这件事很感兴趣,如果我发现了一些东西,我会更新。这看起来肯定是答案,谢谢你指出了关于分配返回值的问题!然而,+Kaddath提出了一个问题,即这是否会等待代码执行,特别是对于较大的文件,还是会像您提到的那样在下载后立即运行。我还没有找到任何关于这方面的文档。我现在将把它标记为答案。希望有人能给出我们正在寻找的答案——浏览器在调用onload之前是否会等待附加脚本的执行,但目前看来这似乎解决了问题。谢谢!:)谢谢你的建议!不幸的是,这并不能回答这个问题,因为我说的是动态添加脚本。
var jstag = document.createElement("script");
document.head.appendChild(jstag);
// Browsers:
jstag.onload=function() { load_js_callback("example"); };