Próbuję uruchomić zdarzenie onload w tagu skryptu

104

Próbuję załadować zestaw skryptów w kolejności, ale zdarzenie onload nie jest uruchamiane.

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

Wydaje mi się, że zdarzenia natywne, takie jak el.onload, nie są uruchamiane, gdy do dodania elementu do DOM jest używane jQuery. Jeśli używam natywnego, document.body.appendChild(el)to odpala zgodnie z oczekiwaniami.

chovy
źródło
odwiedź: thi link: stackoverflow.com/questions/4845762/… To jest użycie fuull
Jitesh

Odpowiedzi:

148

Należy ustawić srcatrybut po tym onloadwydarzeniu, f.ex:

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

Powinieneś także dołączyć skrypt do DOM przed dołączeniem onloadzdarzenia:

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

Pamiętaj, że musisz sprawdzić readystateobsługę IE. Jeśli używasz jQuery, możesz również wypróbować getScript()metodę: http://api.jquery.com/jQuery.getScript/

David Hellsing
źródło
11
to właściwie tego nie naprawia. Ale jeśli po prostu użyję document.body.appendChild(el)zamiast $ ('body'). Append (el); następnie zdarzenie onload jest uruchamiane zgodnie z oczekiwaniami.
chovy
34
czy możesz mi pomóc zrozumieć, dlaczego zamówienie jest ważne?
chovy
12
@David Dlaczego nie dołączyć elementu na końcu, zgodnie z zaleceniami w miejscach takich jak html5rocks.com/en/tutorials/speed/script-loading ? To powinno sprawić, że kolejność dodawania detektora zdarzeń i ustawienie go będzie srcnieistotna.
Stuart P. Bentley
3
Jestem ciekawy: dlaczego ważne jest, aby dołączyć element do DOM przed ustawieniem atrybutów onloadi src?
Jake Wilson
1
Jeśli skrypt jest zapisany w pamięci podręcznej, to po dodaniu src element jest ładowany, a onload nie jest uruchamiany. Dodanie onload przed src zapewni, że onload uruchomi się dla buforowanych skryptów.
JonShipman