Динамическая кросс-браузерная загрузка скриптов - PullRequest
13 голосов
/ 17 июля 2011

Я знаю, что в IE нет события load для <script> элементов - есть ли способ исправить это надежно?

Я видел некоторые разговоры о вещах (например, requestState == "complete"), но ничего не поддающееся проверке.


Это нужно использовать, чтобы код мог вызываться послезагрузка завершена, поэтому мне не нужно использовать AJAX для загрузки новых источников (что устраняет проблемы с междоменным AJAX).

Ответы [ 3 ]

25 голосов
/ 17 июля 2011

Вы можете использовать загрузчик скриптов, например head.js . Он имеет свой собственный обратный вызов загрузки, и это также уменьшит время загрузки.


Из кода headjs: (слегка изменен для большей переносимости)

function scriptTag(src, callback) {

    var s = document.createElement('script');
    s.type = 'text/' + (src.type || 'javascript');
    s.src = src.src || src;
    s.async = false;

    s.onreadystatechange = s.onload = function () {

        var state = s.readyState;

        if (!callback.done && (!state || /loaded|complete/.test(state))) {
            callback.done = true;
            callback();
        }
    };

    // use body if available. more safe in IE
    (document.body || head).appendChild(s);
}
4 голосов
/ 29 июля 2013

Я хочу добавить, что если вы не поддерживаете IE7 и ниже, вам не нужны onreadystatechange вещи. Источник: quircksmode.org

Упрощенный и рабочий код из исходного ответа:

function scriptTag (src, callback) {

   // src is just a string now!

    var s = doc.createElement('script');
    s.type = 'text/javascript';
    s.src = src;
    s.async = false;
    s.onload = callback;        
    document.body.appendChild(s);
}
2 голосов
/ 25 ноября 2012

Это просто продолжение ответа Ильи.Я использовал scriptTag так: Отлично работает:

    // these 3 scripts load serially.

    scriptTag(boot_config.DEPENDENCIES.jquery,function(){
        // jquery ready - set a flag
        scriptTag(boot_config.DEPENDENCIES.jqueryui,function(){
            // jqueryui ready - set a flag
            scriptTag(boot_config.DEPENDENCIES.your_app,function(){
                // your_app is ready! - set a flag
            });
        });
    });

    // these 2 scripts load in paralell to the group above

    scriptTag(boot_config.EXTERNALS.crypto,function(){
        // crypto ready - set a flag
    });

    scriptTag(boot_config.EXTERNALS.cropper,function(){
        // cropper ready - set a flag
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...