Динамично Включая jQuery с помощью JavaScript, если это уже не присутствует

Я пишу немного инструмента JavaScript для меня, что я планирую предоставление доступа для других людей, и это использует jQuery. Моя мечта об этой небольшой утилите состоит в том, чтобы люди смогли включать сингл .js файл из удаленного источника и, когда тот файл загружается, имеет его проверка, чтобы видеть, был ли jQuery уже включен и, если он имеет, удостоверьтесь, что это - достаточно недавняя версия, чтобы быть совместимым с тем, что должен сделать мой код. Некоторый псевдокод, который может объяснить мою проблему более ясно (этот код появился бы наверху сингла .js файл я упомянул ранее):

if jQuery is loaded {
    if version is less than (say) 1.3 {
        // load latest version of jQuery 
    }
} else {
    // load latest version of jQuery
}

// and do the jQuery.noConflict() 
// dance to avoid trampling any other libraries, etc. that the 
// user may be utilizing.

// The rest of my code lives here, happy in the knowledge that it's running in
// isolation from the rest of the JS that the page knows about.

Мой вопрос, дистиллированный в три дружественных части:

  1. Действительно ли возможно загрузить две отдельных версии jQuery без них гадящий друг на всем протяжении друга?
  2. Я могу остановить выполнение своего кода JS, в то время как jQuery загружается, затем продолжите двигаться?
  3. Действительно ли возможно использовать noConflict (), поскольку я описываю это? Или я должен просто назвать все с помощью jQuery () и не обеспокоиться им?

Всеобъемлющая идея здесь состоит в том, что любой старый пользователь мог захватить маленький отрывок HTML и бросить его в их site/blog/whatever и иметь его Просто Work™. И так как много современных платформ публикации теперь поставлются с jQuery, я не могу просто бесшумно предположить, что он не работает, и включайте его.

Спасибо за внимание, и сообщите мне, не ли какая-либо часть этого ясна или если я могу обеспечить дополнительный контекст/деталь для создания обеспечения ответа легче.

8
задан inkedmn 29 December 2009 в 09:05
поделиться

5 ответов

function doMyStuff(jQueryJustForThisFn) {
    // do jQuery stuff!
    jQueryJustForThisFn('div').addClass('wow');
}

function check() {
    return window.jQuery && jQuery.fn && /^1\.[3-9]/.test(jQuery.fn.jquery);
}

if ( check() ) {

    doMyStuff( jQuery );

} else {

    var script = document.createElement('script'),

        timer = setInterval(function(){
            if ( check() ) {
                clearInterval(timer);
                document.body.removeChild(script);
                doMyStuff( jQuery.noConflict(true) );
            }
        }, 30);

    script.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js';

    document.body.insertBefore( script, document.body.firstChild );

}
15
ответ дан 5 December 2019 в 10:03
поделиться

Я мало что знаю о noConflict, так что я могу ответить только 2.

Это обычно называется ленивой загрузкой. Смотрите мой ответ на похожий вопрос

.
0
ответ дан 5 December 2019 в 10:03
поделиться

Я не пытался посмотреть, как он ведет себя с уже загруженной нижней версией, но, возможно, вы захотите проверить google.load

http://code.google.com/apis/ajaxlibs/documentation/#googleDotLoad

0
ответ дан 5 December 2019 в 10:03
поделиться

В целях абсолютной безопасности, возможно, вы захотите рассмотреть вариант jQuery, который вы используете. Это немного уродливо, но регресс против кодовой базы для определения вашей собственной глобальной точки прикрепления гарантирует, что вы ничего не сломаете. Если код будет широко распространен на различных сайтах, это будет вашим лучшим вариантом и обеспечит совместимость в будущем

.
0
ответ дан 5 December 2019 в 10:03
поделиться
(function(){

    var myBkl = {
             jq: null,
             loadScript: function(src) {
                    if(window.jQuery && window.jQuery.fn.jquery == '1.3.2'){
                            return;
                    }
                    var s = document.createElement('script');
                    s.setAttribute('src', src);
                    s.setAttribute('type', 'text/javascript');
                    document.getElementsByTagName('head')[0].appendChild(s); 
            },
            whenLoaded: function(callback){
                    if (typeof(window.jQuery) !== 'undefined' && window.jQuery.fn.jquery == '1.3.2') { 
                            myBkl.jq = window.jQuery.noConflict(true);
                            callback(myBkl.jq); 
                    } 
                    else {
                            setTimeout((function() {myBkl.whenLoaded(callback); }),      
100);
                    } 
            },
            init: function($){
                    console.log($.fn.jquery);
                    console.log(window.jQuery.fn.jquery);
            }
    };
    myBkl.loadScript('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js');
    myBkl.whenLoaded(myBkl.init);
})();
1
ответ дан 5 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: