Объединить $ функцию прототипа и jQuery
-
12-09-2019 - |
Вопрос
Есть ли какая-либо функция JavaScript, которая может объединить $ function как из Prototype, так и из jQuery?
Да, это реальный вариант использования, с которым я сейчас сталкиваюсь.Я нахожу, что $ function в Prototype и $ в jQuery конфликтуют друг с другом.Я знаю, что мы могли бы использовать jQuery.noConflict() для переназначения $ обратно в Prototype, однако при этом мне придется переписать специфичный для jquery код javacript, который использует эту функцию $, или использовать jquery, специфичный для блока кода (например.анонимная функция).
Есть ли какой-нибудь более простой способ, без необходимости переписывать существующий код в обеих библиотеках и размещать их на одной странице?
Код, который мог бы ответить на этот вопрос, может выглядеть следующим образом, и мы очень ценим ваши отзывы:
<script type="text/javascript" src="/path/to/prototype.js"></script>
<script type="text/javascript" src="/path/to/jquery.js"></script>
<script type="text/javascript">
/* <![CDATA[ */
var $j = jQuery.noConflict();
var $p = $; // reference to prototype's $
var $ = function(E, F){
var isJQuery = true;
//TODO: logic to determine which $ to use here YOUR SUGGESTION HERE ;-)
var result = null;
if(isJQuery){
result = $j(E, F);
} else { // prototype
//TODO: code to delegate prototype $
}
return result;
}
/* ]]>*/
</script>
// ... any existing javacode jQuery and Prototype using $ function.
Спасибо.
Обновить:Перепишите вопрос, чтобы он был более понятным.
Решение
Ну, во-первых, я редко могу найти полезные случаи, когда обе библиотеки должны быть включены на одной странице.Так что вы могли бы подумать о том, чтобы удалить один из них.
Я предполагаю, что это связано с использованием плагина, но взгляните на список плагинов противника, я совершенно уверен, что есть альтернатива.
Во-вторых, для вашего специфичного для jQuery кода его довольно легко переписать, используя трюк с анонимной функцией:
(function($){
... your code here ...
})(jQuery);
Это будет работать в большинстве случаев, когда вы не вводите глобальные переменные или методы, а не привязываете их к событиям.
Другие советы
У меня всегда была привычка помещать весь мой код jQuery в функцию, аналогичную примеру gizmo:
jQuery(function($) {
// jQuery code here, using $
});
это то же самое, что и обработчик события document.ready.
jQuery отлично поработал над тем, чтобы убедиться, что они хорошо работают с Prototype.Проверьте эту страницу для получения подробной информации, Предотвращение конфликтов с другими библиотеками.
Я уже видел, как обе библиотеки использовались на одних и тех же страницах, и обычно это происходит из-за того, что сторонние приложения, находящиеся на ваших страницах, используют одну библиотеку, в то время как ваши страницы используют другую.Однако, если вы занимаетесь всей разработкой самостоятельно, я предлагаю придерживаться того или иного варианта.