Javascript 试图在脚本标记上触发onload事件

Javascript 试图在脚本标记上触发onload事件,javascript,jquery,onload,Javascript,Jquery,Onload,我正试图按顺序加载一组脚本,但onload事件没有为我触发 var scripts = [ '//cdnjs.cloudflare.com/ajax/libs/less.js/1.3.3/less.min.js', '//cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0-rc.3/handlebars.min.js', MK.host+'/templates/templates.js'

我正试图按顺序加载一组脚本,但onload事件没有为我触发

    var scripts = [
        '//cdnjs.cloudflare.com/ajax/libs/less.js/1.3.3/less.min.js',
        '//cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0-rc.3/handlebars.min.js',
        MK.host+'/templates/templates.js'
    ];

    function loadScripts(scripts){
        var script = scripts.shift();
        var el = document.createElement('script');
        el.src = script;
        el.onload = function(script){
            console.log(script + ' loaded!');
            if (scripts.length) {
                loadScripts(scripts);
            }
            else {
                console.log('run app');
                MK.init();
            }
        };

        $body.append(el);
    }

    loadScripts(scripts);

我猜当使用jQuery将元素附加到DOM时,像el.onload这样的本机事件不会触发。如果我使用本机
document.body.appendChild(el)
,则它会按预期触发。

您应该在
onload
事件之后设置
src
属性,例如:

el.onload = function() { //...
el.src = script;
在附加
onload
事件之前,还应将脚本附加到DOM

$body.append(el);
el.onload = function() { //...
el.src = script;

请记住,您需要检查
readystate
以获得IE支持。如果您正在使用jQuery,还可以尝试
getScript()
方法:

我遇到了类似的问题,试图测试jQuery是否已经出现在页面上,如果没有,则强制加载,然后执行一个函数。我尝试了@David Hellsing解决方案,但没有机会满足我的需求。事实上,
onload
指令立即被评估,然后该函数中的
$
用法还不可能(是的,巨大的“$不是函数。”^^^)

因此,我提到了这篇文章: 并将事件侦听器附加到我的脚本对象

var script = document.createElement('script');
script.type = "text/javascript";
script.addEventListener("load", function(event) {
    console.log("script loaded :)");
    onjqloaded();
});
script.src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(script);

根据我的需要,它现在很好用。希望这能帮助其他人:)

访问:thi链接:这是一个实际无法解决的问题。但是如果我只是使用
document.body.appendChild(el)
而不是$('body').append(el);然后,onload事件按预期触发。你能帮我理解为什么排序很重要吗?@David为什么不按照建议的那样将元素追加到最后,如?这应该会使添加事件侦听器和设置
src
的顺序变得无关紧要。我很好奇:为什么在设置
onload
src
属性之前将元素附加到DOM很重要?如果脚本被缓存,那么一旦添加了src,项目就被加载,onload就不会触发。在src之前添加onload将确保为缓存脚本触发onload。