Проверьте, загружен ли уже скрипт. Если нет, загрузите его асинхронно - PullRequest
2 голосов
/ 11 декабря 2011

Я пытаюсь загрузить 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");

Может кто-нибудь, пожалуйста, сообщите мне, есть ли какие-либо ошибки в этом коде или есть лучший способ сделать это?

1 Ответ

0 голосов
/ 12 мая 2013

Я искал что-то подобное и нашел это http://themergency.com/an-alternative-to-jquerys-getscript-function/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...