Спроба запустити подію завантаження на тегу сценарію


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

Думаю, рідні події, такі як el.onload, не запускаються, коли jQuery використовується для додавання елемента до DOM. Якщо я використовую рідну, document.body.appendChild(el)то вона спрацьовує, як очікувалося.


відвідати: Тхі посилання: stackoverflow.com/questions/4845762 / ... Це використання fuull
Jitesh

Відповіді:


143

Ви повинні встановити srcатрибут після в onloadразі, f.ex:

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

Вам також слід додати сценарій до DOM перед приєднанням onloadподії:

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

Пам'ятайте, що вам потрібно перевірити readystateпідтримку IE. Якщо ви використовуєте jQuery, ви також можете спробувати getScript()метод: http://api.jquery.com/jQuery.getScript/


11
це насправді не виправляє. Але якщо я просто використовую document.body.appendChild(el)замість $ ('body'). Append (el); тоді подія завантаження спрацьовує, як очікувалося.
chovy

34
Ви можете допомогти мені зрозуміти, чому замовлення важливо?
chovy

12
@David Чому б не додати елемент останнім, як рекомендується в таких місцях, як html5rocks.com/en/tutorials/speed/script-loading ? Це має зробити порядок додавання прослуховувача події та встановити як srcневідповідний.
Стюарт П. Бентлі

3
Мені цікаво: Чому так важливо , щоб прикріпити елемент до DOM перед установкою onloadі srcатрибути?
Джейк Вілсон,

1
Якщо скрипт кешований, як тільки ви додасте src, елемент завантажується, і завантаження не запускається. Додавання onload перед src забезпечить активацію onload для кешованих сценаріїв.
JonShipman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.