【问题标题】:Trying to fire the onload event on script tag试图在脚本标签上触发 onload 事件
【发布时间】:2013-04-20 07:12:06
【问题描述】:

我正在尝试按顺序加载一组脚本,但我没有触发 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),那么它会按预期触发。

【问题讨论】:

标签: javascript jquery onload


【解决方案1】:

您应该在onload 事件之后设置src 属性,f.ex:

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

您还应该在 附加 onload 事件之前将脚本附加到 DOM:

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

请记住,您需要查看readystate 以获得 IE 支持。如果你使用 jQuery,也可以试试getScript() 方法:http://api.jquery.com/jQuery.getScript/

【讨论】:

  • 这实际上并没有解决它。但如果我只使用 document.body.appendChild(el) 而不是 $('body').append(el);然后按预期触发 onload 事件。
  • 你能帮我理解为什么排序很重要吗?
  • @David 为什么不按照html5rocks.com/en/tutorials/speed/script-loading 等地方的建议将元素添加到最后?这应该使您添加事件侦听器并将src 设置为无关紧要的顺序。
  • 我很好奇:为什么在设置 onload 和 src 属性之前将元素附加到 DOM 很重要?
  • 如果脚本被缓存,那么一旦你添加了 src,项目就会被加载并且 onload 不会触发。在 src 之前添加 onload 将确保 onload 触发缓存脚本。
【解决方案2】:

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

所以,我参考了这篇文章:https://developer.mozilla.org/fr/docs/Web/Events/load 并将事件侦听器附加到我的脚本对象。

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);

根据我的需要,它现在可以正常工作了。希望这可以帮助其他人:)

【讨论】:

  • 它在 chrome 上不起作用,脚本已加载但未触发事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
相关资源
最近更新 更多