Я пишу немного инструмента 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.
Мой вопрос, дистиллированный в три дружественных части:
Всеобъемлющая идея здесь состоит в том, что любой старый пользователь мог захватить маленький отрывок HTML и бросить его в их site/blog/whatever и иметь его Просто Work™. И так как много современных платформ публикации теперь поставлются с jQuery, я не могу просто бесшумно предположить, что он не работает, и включайте его.
Спасибо за внимание, и сообщите мне, не ли какая-либо часть этого ясна или если я могу обеспечить дополнительный контекст/деталь для создания обеспечения ответа легче.
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 );
}
Я мало что знаю о noConflict, так что я могу ответить только 2.
Это обычно называется ленивой загрузкой. Смотрите мой ответ на похожий вопрос
.Я не пытался посмотреть, как он ведет себя с уже загруженной нижней версией, но, возможно, вы захотите проверить google.load
http://code.google.com/apis/ajaxlibs/documentation/#googleDotLoad
В целях абсолютной безопасности, возможно, вы захотите рассмотреть вариант jQuery, который вы используете. Это немного уродливо, но регресс против кодовой базы для определения вашей собственной глобальной точки прикрепления гарантирует, что вы ничего не сломаете. Если код будет широко распространен на различных сайтах, это будет вашим лучшим вариантом и обеспечит совместимость в будущем
.(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);
})();