スクリプトタグでonloadイベントを発生させようとしています


100

一連のスクリプトを順番に読み込もうとしていますが、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)と、期待どおりに起動します。


visit:thi link:stackoverflow.com/questions/4845762/… これは完全なものです
Jitesh

回答:


143

あなたが設定する必要がありsrc、属性の後にonloadイベントを、f.ex:

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

イベントをアタッチする前に、スクリプトをDOM 追加する必要もありますonload

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

readystateIEのサポートを確認する必要があることに注意してください。jQueryを使用している場合は、次のgetScript()メソッドも試すことができます:http : //api.jquery.com/jQuery.getScript/


11
それは実際にはそれを修正しません。しかし、私document.body.appendChild(el)が$( 'body')。append(el);の代わりに使用した場合 その後、期待どおりにonloadイベントが発生します。
チョビー

34
順序が重要な理由を理解するのに役立ちますか?
ショビー

12
以下のような場所で推奨されているよう@デビッドなぜ、最後の要素を追加していないhtml5rocks.com/en/tutorials/speed/script-loading?これにより、イベントリスナーを追加し、srcを無関係に設定する必要があります。
スチュアートP.ベントレー

3
気になります:onloadsrc属性を設定する前に、DOMに要素をアタッチすることがなぜ重要なのですか?
ジェイクウィルソン

1
スクリプトがキャッシュされている場合、srcを追加するとすぐにアイテムがロードされ、onloadは起動しません。srcの前にonloadを追加すると、キャッシュされたスクリプトに対してonloadが確実に起動します。
JonShipman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.