Prototype.js конфликт с плагинами jquery

#jquery #prototypejs #selectize.js

#jquery #prototypejs #selectize.js

Вопрос:

Мое приложение использовало prototype.js на какое-то время. Сейчас я пытаюсь использовать jQuery и плагин jquery для некоторой расширенной функциональности. Однако prototype.js и jQuery создает конфликт для использования переменной ‘$’. Это, конечно, может быть разрешено методом noConflict(), предоставляемым jQuery, и, следовательно, я могу изменить ярлык jQuery на то, что я хочу. Проблема в том, как мне использовать плагин jQuery, который я хочу импортировать. Конечно, есть лучший способ, чем найти и заменить все переменные ‘$’.

Используемый плагин ‘Selectize’ https://github.com/brianreavis/selectize.js

Комментарии:

1. Работает ли это, если заменить все переменные $?

2. К какому плагину вы относитесь?

Ответ №1:

Вы отредактировали свой вопрос, чтобы сказать:

Используемый плагин ‘Selectize’ https://github.com/brianreavis/selectize.js

Этот плагин вообще не полагается на глобальный $ символ; вам ничего не нужно делать, чтобы сделать плагин совместимым с сайтом, который использует $ для чего-то другого (например, Prototype). Плагин полагается только на jQuery символ. (Он использует $ внутренне, но только как локальную переменную; он не использует глобальную.) Любой правильно написанный плагин jQuery избегает использования глобальной $ из-за этой самой проблемы.

Чтобы использовать это на своем сайте, вы должны сделать что-то вроде этого:

 <script src="/path/to/prototype.js"></script>
<script src="/path/to/jquery.js"></script>
<script src="/path/to/your/code.js></script>
  

… где ваш код может выглядеть следующим образом:

 (function() {
    var $j = jQuery.noConflict();
    $j("some-selector").pluginMethod();  // jQuery
    $("some-id").addClassName("foo");    // Prototype
})();
  

(Вам не нужна функция-оболочка там, это просто для того, чтобы избежать создания $j глобального).

Или просто:

 jQuery.noConflict();
jQuery("some-selector").pluginMethod();  // jQuery
$("some-id").addClassName("foo");        // Prototype
  

Комментарии:

1. Огромное спасибо. Мой плохой.

2. @Zeutheus: Не беспокойтесь, рад, что помогло. (Ваш плохой? Не следуя, ваш вопрос был вполне разумным.)

Ответ №2:

Я думаю, что у T.J. Crowder есть хороший ответ, но в качестве альтернативы, если вам нужно управлять конфликтами и т. Д. Во всем вашем проекте. Возможно, вы захотите рассмотреть requirejs.

Я не буду вдаваться в подробности о requirejs, поскольку их можно найти на его сайте.

RequireJS — это загрузчик модулей, помогающий справляться с подобными проблемами, и имеет функции, помогающие с javascript, который не соответствует шаблону асинхронного модуля.

Вот статья, в которой обсуждается его использование с jQuery и плагинами. http://requirejs.org/docs/jquery.html