Вы можете сделать это с помощью noConflict(true)
:
var myJQuery = jQuery.noConflict(true);
Параметр true
указывает jQuery освободить символ jQuery
в дополнение к символу $
.Просто добавьте это в конец файла jQuery.js, который вы встраиваете в элемент управления.
Сценарий jQuery хорошо разбирается в конфликтах.Первое, что он делает, - захватывает текущее значение $
и jQuery
и сжимает их, чтобы он мог восстановить их позже, если вы попросите об этом.Поэтому, если ваш скрипт загружается первым, ни $
, ни jQuery
не будут определены, и новый может их иметь.Если ваш скрипт загружается вторым, он восстанавливает ранее $
и jQuery
.
Пример :
Предположим, выиспользуя самую последнюю версию (v1.5.1), но автор страницы использует более старую версию 1.4.4.Фактически, добавив var jq151 = jQuery.noConflict(true);
в конец файла 1.5.1, вы делаете это:
<script src='jquery-1.5.1.min.js'></script>
<script>var jq151 = jQuery.noConflict(true);</script>
... за исключением того, что все это будет в одном теге сценария.Итак, две возможности:
1) Они идут первыми:
<script src='jquery-1.4.4.min.js'></script>
<script src='jquery-1.5.1.min.js'></script>
<script>var jq151 = jQuery.noConflict(true);</script>
Живой пример
2) Вы идете первыми:
<script src='jquery-1.5.1.min.js'></script>
<script>var jq151 = jQuery.noConflict(true);</script>
<script src='jquery-1.4.4.min.js'></script>
Живой пример
В любом случае, jQuery
и $
в конечном итоге указывают на свою версию 1.4.4, а jq151
в конечном итоге указывает на ваш 1.5.1 версия.
Возможно, немного не по теме, но для любого, кто думает, что это немного волшебно, на самом деле это действительно легко.:-) Вот скрипт, который переопределит foo
, но восстановит предыдущее определение, если вы попросите его:
// The script
(function() {
var globalObject = this, // Or just use `window` on browsers
oldfoo,
ourfoo;
oldfoo = globalObject.foo;
ourfoo = globalObject.foo = {
version: "new",
restorePrevious: restorePrevious
};
function restorePrevious() {
globalObject.foo = oldfoo;
return ourfoo;
}
})();
Пример с foo
, определенным перед вышеупомянутым
Пример с foo
, определенным после вышеупомянутого (если вам интересно, почему это работает, несмотря на то, что var foo
является после сценария, вот некоторое чтение при чтении на плохом, неправильно понятом var
)
О плагинах : Вы спросили ниже о плагинах.Плагины регистрируются, присваивая их функции свойствам jQuery.fn
и (в некоторых случаях) jQuery
, например:
jQuery.fn.makeFoo = function() {
};
С помощью вышеизложенного вы можете получить доступ к функции makeFoo
наjQuery экземпляры (например, $('foo').makeFoo();
).Хорошо написанный плагин гарантирует, что он будет хорошо работать как с noConflict()
, так и noConflict(true)
, используя следующую структуру:
(function($) {
$.fn.makeFoo = function() {
$(this).addClass("foo");
};
})(jQuery);
... или тому подобное.(С учетом вышеизложенного мы бы никогда не использовали бы jQuery
для ссылки на jQuery в теле функции. Если бы мы хотели, мы могли бы добавить var jQuery = $;
вверху.)
Это определяет анонимную функцию и немедленно вызывает ее, передавая текущее глобальное значение для jQuery
.Он получает это как $
аргумент , и поэтому внутри функции символ $
будет всегда быть экземпляром jQuery
, который он передал в себя.Он может свободно использовать $
, зная, что он ссылается на версию jQuery, в которой он зарегистрирован.
Только несколько хорошо написанный плагин может предполагать, что jQuery
всегда будет одинаковым (например,хорошо играет только с noConflict()
, а не с noConflict(true)
).Вы можете исправить это, хотя.Если вы столкнетесь с ним, сделайте его копию и поместите
(function($) {
var jQuery = $;
... вверху и
})(jQuery);
... внизу.В 99% случаев это будет вести себя так.
Если вы хотите использовать плагины со встроенным экземпляром jQuery, лучше всего включить их в вашего файла.Таким образом, содержимое файла становится:
- Сценарий jQuery
- (скрипт плагина)
- (скрипт плагина)
- ...
- Ваш
var jq151 = jQuery.noConflict(true);