Javascript 检查脚本是否已加载。如果不是,则异步加载它

Javascript 检查脚本是否已加载。如果不是,则异步加载它,javascript,asynchronous,Javascript,Asynchronous,我尝试异步加载jQuery JS,然后在完全加载后调用一些回调方法。 我可能一次又一次地使用相同的代码块。因此,我想在实际添加jQuery(或任何其他脚本)之前检查它是否已经被添加。如果它已经被加载/加载,那么当前调用的回调应该附加到上一个调用的回调之后。这就是我想做的 /*BP Asynchronous JavaScript Loader*/ if (typeof bp_onload_queue == 'undefined') var bp_onload_queue = []; if (ty

我尝试异步加载jQuery JS,然后在完全加载后调用一些回调方法。 我可能一次又一次地使用相同的代码块。因此,我想在实际添加jQuery(或任何其他脚本)之前检查它是否已经被添加。如果它已经被加载/加载,那么当前调用的回调应该附加到上一个调用的回调之后。这就是我想做的

/*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");
/*BP异步JavaScript加载程序*/
如果(bp_onload_queue的类型=='未定义')变量bp_onload_queue=[];
如果(bp_dom_loaded='boolean')bp_dom_loaded=false;
else var bp_dom_loaded=false;
if(bp_异步_加载器的类型!=“函数”){
函数bp\u async\u loader(src、回调、id){
var script=document.createElement('script');
script.type=“text/javascript”;
script.async=true;
script.src=src;
script.id=id;
//检查以前是否加载了脚本。
var previous_script=document.getElementById(id);
if(上一个脚本)if(上一个脚本.readyState==“已加载”| |上一个脚本.readyState==“已完成”){
回调();
警报(“已完全加载同一脚本”);
回来
}否则{
脚本=上一个脚本;
}
如果(script.onload!=null)上一次回调=script.onload;
script.onload=script.onreadystatechange=function(){
var-newcallback;
if(previous_script&&previous_callback)newcallback=function(){
上一个_回调();
回调();
};
else newcallback=回调;
如果(已加载bp_dom_){
newcallback();
}else bp_onload_queue.push(newcallback);
//为IE和Opera清理干净
script.onload=null;
script.onreadystatechange=null;
};
var head=document.getElementsByTagName('head')[0];
if(!previous_script)head.appendChild(script);
else alert(“已开始加载该脚本,但尚未完成。因此,我们附加到上一个脚本的回调”);
}
}
if(类型为bp_domload!=“函数”)函数bp_domload(回调){
bp_dom_loaded=true;
var len=bp_onload_queue.length;
对于(变量i=0;i

有人能告诉我这段代码中是否有错误,或者是否有更好的方法来执行此操作吗?

我正在搜索类似的内容,并找到了此

我在搜索类似的东西,发现了这个

通常更好的方法是不要这样做-将jquery添加到需要使用它的页面,而不要将它添加到不需要的页面。如果您在服务器上使用某种框架,它可能有一些工具,以便我们可以声明特定模块假定页面中存在某些脚本。感谢您的快速响应:)。这段代码是为一个JavaScript插件编写的,我将在不同的插件中重用相同的脚本。所以我想消除再次加载的相同脚本。我试图做一些类似FB加载JavaScript SDK的事情。你可以使用google loader加载jquery,或者至少看看他们是如何做到的。不过,我认为您需要一个API密钥。通常更好的方法是不要这样做——将jquery添加到需要使用它的页面,而不要将它添加到不需要的页面。如果您在服务器上使用某种框架,它可能有一些工具,以便我们可以声明特定模块假定页面中存在某些脚本。感谢您的快速响应:)。这段代码是为一个JavaScript插件编写的,我将在不同的插件中重用相同的脚本。所以我想消除再次加载的相同脚本。我试图做一些类似FB加载JavaScript SDK的事情。你可以使用google loader加载jquery,或者至少看看他们是如何做到的。不过,我认为您需要一个API密钥。