Tentando disparar o evento onload na tag de script

100

Estou tentando carregar um conjunto de scripts em ordem, mas o evento onload não está disparando para mim.

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

Acho que eventos nativos como el.onload não disparam quando jQuery é usado para anexar o elemento ao DOM. Se eu usar o nativo document.body.appendChild(el), ele dispara conforme o esperado.

chovy
fonte
visite: este link: stackoverflow.com/questions/4845762/… Este é o uso completo
Jitesh

Respostas:

143

Você deve definir o srcatributo após o onloadevento, f.ex:

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

Você também deve anexar o script ao DOM antes de anexar o onloadevento:

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

Lembre-se de que você precisa verificar o readystatesuporte do IE. Se você estiver usando jQuery, também pode tentar o getScript()método: http://api.jquery.com/jQuery.getScript/

David Hellsing
fonte
11
isso na verdade não resolve. Mas se eu apenas usar em document.body.appendChild(el)vez de $ ('body'). Append (el); em seguida, o evento onload dispara conforme o esperado.
chovy
34
você pode me ajudar a entender por que o pedido é importante?
chovy
12
@David Por que não anexar o elemento por último, conforme recomendado em locais como html5rocks.com/en/tutorials/speed/script-loading ? Isso deve tornar srcirrelevante a ordem em que você adiciona o ouvinte de evento e define o in.
Stuart P. Bentley
3
Estou curioso: por que é importante anexar um elemento ao DOM antes de definir os atributos onloade src?
Jake Wilson
1
Se o script estiver armazenado em cache, assim que você adicionar o src, o item será carregado e o onload não será acionado. Adicionar o onload antes do src garantirá que o onload seja acionado para scripts em cache.
JonShipman