Использование разных версий jQuery и jQueryUI вместе

Я работаю над проектом, в котором их фреймворк использует jQuery 1.3.2 и jQueryUI 1.7.2.

Обновление версий в структуре не является возможным, поэтому я хотел бы параллельно запускать jQuery 1.4.4 и jQueryUI 1.8.5.

Я видел, что различные версии jQuery могут использоваться параллельно:

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>  
    <script type="text/javascript">
        var j$132 = $.noConflict(true);
    </script>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
    <script type="text/javascript">
        var j$144 = $.noConflict(true);
    </script>

Но это также справедливо для следующего:

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script> 
    <script type="text/javascript">
        var j$132 = $.noConflict(true);
    </script>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5/jquery-ui.min.js"></script>
    <script type="text/javascript">
        var j$144 = $.noConflict(true);
    </script>

Ответ 1

AFAIK, нет эквивалента $.noConflict() для jQuery UI. Однако вы можете использовать локальную копию пользовательского интерфейса jQuery и обернуть весь JS, используя аналогичный трюк, который вы используете для сглаживания разных библиотек:

(function(jQuery) {
  // ... the jQuery UI lib code for jQuery 1.3.2
})(j$132);

Это может быть элегантно реализовано с использованием серверной сборки script или обработчика, который обслуживает файлы JS, но обертывает содержимое указанным выше кодом.

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

Как вы это используете, объявите обе версии jQuery:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>  
<script type="text/javascript">
    var j$132 = $.noConflict(true);
</script>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
<script type="text/javascript">
    var j$144 = $.noConflict(true);
</script>

... и затем укажите свой код пользовательского интерфейса, как указано выше.

И нет, вы не можете этого сделать, ссылаясь на UI JS файлы из Google CDN.

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

Ответ 2

Я попал на эту страницу, потому что у меня такая же проблема, как описано в исходном вопросе, но ответ не полностью решает его (больше).

Мне нужно было добавить автоматическое предложение на страницу с большим количеством существующего кода с помощью jquery, не было простого способа просто обновить новый jquery и jquery ui, поэтому попытался использовать более новую версию рядом со старой.

Помимо редактирования последней строки jqueryui в jquery ui есть много ссылок jQuery, которые вам нужно изменить, поэтому я использовал редактор, который может заменить с помощью регулярного выражения и заменить: \ BjQuery\б с J $182

An на странице, которую я добавил:

<script src="http://code.jquery.com/jquery-1.8.2.js"></script>
    <script type="text/javascript">
        var j$182 = $.noConflict(true);
        </script>
<script type="text/javascript" src="jqueryui1.9.0.js"></script>

Теперь как существующие script на странице, так и новые подсказки автоматически работают.

Ответ 3

Я просто решил решение, и оно работает для меня.

В библиотеке JQuery после последнего типа строки

var mySelector = $;

Включите другую версию после ее включения на свою страницу.

теперь, во всех сценариях, которые вы хотите использовать с этой версией jquery (даже jquery ui и другими библиотеками тоже), замените $на mySelector. Используйте replaceall, там будет несколько мест, например, в функциях соответствия регулярных выражений, где вы захотите заменить mySelector на $. Эта проблема довольно долго меня раздражала. И он просто решил.

РЕДАКТИРОВАНО: убедитесь, что вы не замените никаких $внутри оригинала jQuery script.