Вопрос

Есть ли какая-либо функция 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.Проверьте эту страницу для получения подробной информации, Предотвращение конфликтов с другими библиотеками.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top