简体   繁体   English

检查脚本是否已经加载。 如果不是,请异步加载

[英]Check if script is loaded already. If not, load it asynchronously

I'm trying to load the jQuery JS asynchronously and then i want to call some callback methods when it is completely loaded. 我试图异步加载jQuery JS,然后我想在完全加载时调用一些回调方法。 I might be using the same code block over and over again. 我可能会一遍又一遍地使用相同的代码块。 So i want to check if jQuery(or any other script) is already added before actually adding it.If it is already loaded/loading, then the callback of the current call should be appended to that of the previous call. 所以我想在实际添加之前检查是否已经添加了jQuery(或其他脚本),如果已经加载/加载,那么当前调用的回调应该附加到上一个调用的回调中。 This is what i'm trying to do. 这就是我想要做的。

/*BP Asynchronous JavaScript Loader*/
if (typeof bp_onload_queue == 'undefined') var bp_onload_queue = [];

if (typeof bp_dom_loaded == 'boolean') bp_dom_loaded = false;
else var bp_dom_loaded = false;

if (typeof bp_async_loader != 'function') {
    function bp_async_loader(src, callback, id) {

        var script = document.createElement('script');
        script.type = "text/javascript";
        script.async = true;
        script.src = src;
        script.id = id;
        //Check if script previously loaded.
        var previous_script = document.getElementById(id);
        if (previous_script) if (previous_script.readyState == "loaded" || previous_script.readyState == "complete") {
            callback();
            alert("had already loaded the same script completely");
            return;
        } else {

            script = previous_script;
        }
        if (script.onload != null) previous_callback = script.onload;
        script.onload = script.onreadystatechange = function() {
            var newcallback;
            if (previous_script && previous_callback) newcallback = function() {
                previous_callback();
                callback();
            };
            else newcallback = callback;
            if (bp_dom_loaded) {
                newcallback();
            } else bp_onload_queue.push(newcallback);
            // clean up for IE and Opera
            script.onload = null;
            script.onreadystatechange = null;
        };
        var head = document.getElementsByTagName('head')[0];
        if (!previous_script) head.appendChild(script);
        else alert("had already started loading that script but not complete.so we appended to the previous script's callback");

    }
}

if (typeof bp_domLoaded != 'function') function bp_domLoaded(callback) {
    bp_dom_loaded = true;
    var len = bp_onload_queue.length;
    for (var i = 0; i < len; i++) {
        bp_onload_queue[i]();
    }
} 
/*JS gets loaded here */

bp_domLoaded();

/*Loading jQuery Asynchronously */
bp_async_loader("http://code.jquery.com/jquery-1.4.4.js", function() {
    alert("script has been loaded : 1");
}, "jQueryjs");

bp_async_loader("http://code.jquery.com/jquery-1.4.4.js", function() {
    alert("script has been loaded : 2");
}, "jQueryjs");

Can someone please let me know if there are any errors in this code or if there is a better way of doing this? 有人可以让我知道这段代码中是否有任何错误,或者有更好的方法吗?

我正在寻找类似的东西,发现这个http://themergency.com/an-alternative-to-jquerys-getscript-function/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM