2010-12-14 2 views
4

Я работаю над проектом глобализации веб-сайта, в котором мы (поставщик) попросили наших клиентов вставить тег сценария на свой домашний/начальный сайт. Тег сценария необходим, чтобы помочь нашим клиентам стать глобальными, а часть решения воплощает пользовательский интерфейс, который запускается на основе определенных критериев конечного пользователя.Управление сторонними библиотеками javascript с пакетом jQuery

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

Однако такой механизм требует от нас переименовать все экземпляры jQuery в нечто, что поможет нам избежать столкновений имен с другим экземпляром jQuery (если имеется) и делает очень сложным наше искаженное jQuery (MY_Query в примерах ниже) управлять, не говоря уже об обновлении.

Например

jQuery = window.jQuery = window.$ = function(selector, context) { 
    // The jQuery object is actually just the init constructor 'enhanced' 
    return new jQuery.fn.init(selector, context); 
}, 
. 
. 
. 
jQuery.fn = jQuery.prototype = ... 

становится

MY_JQuery = window.MY_JQuery = window.MY_Q = function(selector, context) { 
    // The MY_JQuery object is actually just the init constructor 'enhanced' 
    return new MY_JQuery.fn.init(selector, context); 
}, 
. 
. 
. 
MP_JQuery.fn = MP_JQuery.prototype = ... 

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

Итак, могу ли я управлять нашей версией jQuery (с плагинами) на клиентском сайте без переименования всех экземпляров jQuery с чем-то вроде MY_Query с ограничениями, упомянутыми выше?

+1

Почему бы не связать с библиотеками код JQuery Google, вы все будут иметь ту же версию и никогда не нужно их модернизировать, просто мысль. – brett

+0

довольно сложно убедить клиента сделать это. Кроме того, могут быть юридические причины, по которым клиент отклонил это предложение. –

ответ

4

Почему бы не проверить, есть ли у них jQuery, уже включенный на страницу, и если он не динамически загружает его? Если вы знаете, базовый уровень JQuery необходимо вы можете проверить, что, как это:

if(!jQuery || !jQuery.fn.jquery === "1.4.4"){ 
    var url = "http://code.jquery.com/jquery-1.4.4.js"; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = url; 
    document.body.appendChild(script); 
} 

Вы, вероятно, хотите, чтобы улучшить обнаружение версии, чтобы убедиться, что он не имеет версии после 1.4.4, но Я уверен, что вы могли бы написать код, который сам ;-)

==== Редактировать на основе обратной связи

Таким образом, вы должны поддерживать несколько версий JQuery на этой странице. Вы пробовали что-то вроде этого:

var original_jquery = $().noConflict(); 
original_jquery.getScript("http://code.jquery.com/jquery-1.4.4.js"); 
var new_jquery = $().noConflict(); 
window.$ = original_jquery; 

Затем используйте new_jquery как свою версию jquery? Я не тестировал это, чтобы увидеть, будет ли это работать, но вам может быть повезло с ним.

==== Final редактировать

Как вы сказали, мой Javascript выше было не совсем правильно, так что я попробовал несколько вещей в консоли. И да, вам не нужно сохранять старую версию jQuery, потому что jQuery делает это в методе noConflict.Так просто называют getScript, то noConflict, но сохранение в новой переменной:

>> $.fn.jquery 
"1.4.2" 
>> $.getScript("http://code.jquery.com/jquery-1.4.4.js"); 
undefined 
>> $.fn.jquery 
"1.4.4" 
>> var new_jquery = $.noConflict(); 
undefined 
>> new_jquery.fn.jquery 
"1.4.4" 
>> $.fn.jquery 
"1.4.2" 
+0

, в разных версиях jQuery используются те же пространства имен. Поэтому вышеописанное не будет работать, когда jQuery 1.3.2 находится на сайте, и мы хотим скачать 1.4.4 и автоматически, все ссылки на jQuery теперь указывают на 1.4.4, в то время как наш клиент ожидает, что это будет 1.3.2 –

+0

Есть ли какая-то общая почва, на которую вы программируете? Вы пишете свой код, чтобы он работал только на jQuery 1.4.4? – sioked

+0

Библиотека jQuery, используемая мной, является 1.3.2, а клиенты имеют разные версии. –

1

Вы пытались использовать JQuery.noConflict(). Похоже, это может помочь вам.

+0

Я, безусловно, пробовал использовать jQuery.noConflict(), но это просто освободит ранее установленную переменную $ обратно ее первоначальному владельцу. Все экземпляры jQuery по-прежнему будут затронуты новой загруженной библиотекой jQuery –

Смежные вопросы