Разрешение конфликтов версий jQuery с ASP.NET Server Control - PullRequest
0 голосов
/ 16 марта 2011

Я разрабатываю серверный элемент управления ASP.NET, который использует jQuery для некоторой логики на стороне клиента.Я встроил файл jQuery в качестве ресурса в элемент управления.

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

Я знаю о методе noconflict, но проблема, с которой я сталкиваюсь, заключается в том, что я не могу контролировать порядок тегов сценария на странице.

Если версия пользователяjQuery включается раньше моего, и в итоге я переопределю его, прежде чем смогу вызвать noconflict.

Пожалуйста, помогите

Ответы [ 2 ]

5 голосов
/ 16 марта 2011

Вы можете сделать это с помощью 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);
0 голосов
/ 16 марта 2011

Вот хорошее решение: не используйте jQuery.По крайней мере, не сначала.Используйте javascript, чтобы дождаться загрузки всех сценариев, сохранить значение «$», а затем ввести jQuery через тег script и восстановить предыдущее значение «$».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...