Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何知道动态添加的脚本一旦被解析/加载/执行?_Javascript_Onload - Fatal编程技术网

Javascript 如何知道动态添加的脚本一旦被解析/加载/执行?

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

我试图动态加载一个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(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"); };