2009-04-20 3 views
-1

Есть ли какая-либо функция JavaScript, которая может объединять $ -функцию как из прототипа, так и из jQuery?

Да, это реальный прецедент, с которым я столкнулся сейчас. Я нахожу функцию $ в Prototype, а $ в jQuery противоречит друг другу. Я знаю, что мы могли бы нам jQuery.noConflict() переписать $ обратно на Prototype, однако, сделав это, мне придется переписать jquare-специфический jquery-код, который использует эту функцию $, или иметь 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. 

Спасибо.

обновление: перепишите вопрос, чтобы быть более понятным.

ответ

5

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

Во-вторых, для JQuery конкретного кода, это довольно легко переписать его, используя анонимную функцию трюк:

(function($){ 
    ... your code here ... 
})(jQuery); 

Это будет работать в большинстве случаев, когда вы не поставите глобальные переменные или методы а не привязывать их к событиям.

+0

Спасибо за этот ответ. Примерно через 1 неделю, пытаясь найти разные подходы, я считаю, что этот подход является наиболее подходящим решением. Это решение имеет две основные возможности: (1) Переписать jQuery $, специфичный для анонимных функций, таких как выше, и (2) Нет прямого вызова Prototype $ в анонимной функции выше. Сказав это (две ошибки), это решение является лучшим для большинства случаев использования, которые у меня есть. Спасибо. – Nordin

2

меня всегда в привычку положить весь мой код JQuery в функцию, аналогично примеру Гизмо:

jQuery(function($) { 
    // jQuery code here, using $ 
}); 

это то же самое, как document.ready обработчик событий.

0

jQuery отлично поработал над тем, чтобы они хорошо играли с Prototype. Проверьте эту страницу для получения более подробной информации, Avoiding Conflicts with Other Libraries.

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

Смежные вопросы