动态的跨浏览器脚本加载

时间:2011-07-17 16:40:58

标签: javascript internet-explorer asynchronous cross-browser

我知道IE对load元素没有<script>事件 - 有没有办法可靠地弥补这一点?

我已经看过一些关于事物的讨论(例如,requestState == "complete"),但没有一点可以证实。


这是为了在脚本加载完成后调用代码,这样我就不必使用AJAX来加载新的源代码(从而消除了跨域AJAX的问题)。

3 个答案:

答案 0 :(得分:25)

您可以使用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);
}

答案 1 :(得分:4)

我想补充一点,如果你不支持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 :(得分:2)

这只是ilia答案的延伸。我像这样使用了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
    });