Есть ли элегантный способ медленно обновить jQuery? - PullRequest
5 голосов
/ 08 марта 2011

Мы хотим перейти с одной версии jQuery на другую. Мы используем различные онлайн плагины и написали много наших собственных. Задача теперь состоит в том, чтобы попытаться МЕДЛЕННО МИГРАТЬ все ваши объекты сценариев МЕДЛЕННО без полной перезаписи. У меня есть идея, КАК справиться с этим:

НО У меня есть вопросы:

  1. Является ли идея ниже даже хорошей идеей?
  2. Могу ли я (напрямую) сообщить каждому объекту jQuery, где находятся зависимости?
  3. Если это плохая идея ... как ВЫ справляетесь с этим?
  4. Должен ли я просто переписать КАЖДЫЙ объект, который может сломаться при обновлении? (Ек!)

ОБЪЯСНЕНИЕ ВОПРОСА:
Если весь ваш плагин работает ТОЛЬКО в пределах одной страницы, то легко можно адресовать разные версии: просто включите файл на уровне страницы, а не на уровне главной страницы (дух!). Однако объекты, которые находятся на главной странице или в пользовательских элементах управления, немного сложнее ... поскольку для правильной работы им требуются определенные версии.

ЗДЕСЬ МОЯ ИДЕЯ:
Определение плагина начинается с анонимной функции.

(function ($){<!- code goes here -->})(jQuery);

Все зависимости, которые я видел, используют это как отправную точку.

Примеры: jQuery-зависимости включают в себя плагины, такие как: ui.widget, ui.position, ui.core и т. д.

Так что, если я буду ссылаться на каждую версию jQuery (и ее зависимости), используя объект JavaScript, и передавать ЭТОТ ОБЪЕКТ в различные внутренние и онлайн плагины?

ССЫЛКИ ОБЪЕКТА МОГУТ БЫТЬ ТАКОВЫМИ:

var jQueryVersion1_3_2 = function(){<!- paste the files contents here-->};
var jQueryVersion1_4_4 = function(){<!- paste the files contents here-->};

ПЛАГИНЫ:
Мои собственные и онлайн плагины все еще могут быть включены как (нормальные) ссылки на файлы, но со следующими изменениями

ИДЕТ ОТ ЭТОГО:

// Plug-in X
(function ($){<!- its untouched code -->})(jQuery);
// Plug-in Y
(function ($){<!- its untouched code -->})(jQuery);
// Plug-in Z
(function ($){<!- its untouched code -->})(jQuery);

... версия - отстой!

ДО ЭТОГО ...

// Plug-in X
(function ($){<!- its untouched code -->})(jQueryVersion1_3_2);
// Plug-in Y
(function ($){<!- its untouched code -->})(jQueryVersion1_3_2);
// Plug-in Z
(function ($){<!- its untouched code -->})(jQueryVersion1_4_4);

... теперь мы можем улучшать наши объекты МЕДЛЕННО.

ЕДИНСТВЕННЫЙ ВЫПУСК, КОТОРЫЙ Я ВИДЮ:
Задача становится зависимостью плагина (между версиями). В тестовом обновлении следующее начало распространяться на различные плагины, например:

  • ui.widget, ui.position, ui.core и т. Д. (Все сломалось после обновления).

Единственный ответ, который я вижу:
Упаковка jQuery и всех различных ссылок в одну функцию и сохранение THAT в указанной выше переменной. Затем передайте этот промежуточный объект в каждый плагин AS jQuery.

Помоги мне Оби-Ван Кеноби ... ты моя единственная надежда!

1 Ответ

1 голос
/ 09 марта 2011

Использование $ .noConflict для глобального создания всех ваших версий

<script src="jquery 1.x" />
<script> 
    var jQuery_1_x = $.noConflict(true);
</script>
...

Затем оберните каждый плагин jQuery, внутренний или сторонний, в замыкания, такие как:

(function(jQuery, $) {

    ... // code

}(jQuery_1_x, jQuery_1_x));

Единственное, что может сломаться с помощью этого метода - это сторонний код, который использует var foo вне каких-либо функций для создания глобальных объектов. Вам нужно искать любые глобальные функции / объекты / методы и поднимать их вручную, используя

window.foo = ...

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

...