Подтвердить что ты не робот

Плагины JQuery занимают одно и то же имя функции → конфликт

У меня возникла проблема с использованием jQuery open plugin рядом с плагином Masked Input. Проблема в том, что они оба занимают функцию $.mask, что приводит к конфликту. Но я жизненно нуждаюсь в двух плагинах для совместной работы. Я бы переименовал $.mask в один из них, чтобы... скажем, $.msk, но в этом случае мне всегда нужно запомнить его, и если я хочу перейти на новую версию, я снова переименую.

Ищем лучшее решение о том, как справиться с такими конфликтами между плагинами jquery.

4b9b3361

Ответ 1

Думаю, я согласен с мю. Одно дополнение может заключаться в использовании jQuery.sub().

Так как большинство плагинов используют jQuery global во время построения, вы должны иметь возможность псевдонима jQuery перед загрузкой одного из плагинов. Затем вы можете переименовать потом все, что вы выберете.

<script src="http://cdn.jquerytools.org/1.2.5/full/jquery.tools.min.js?foo"></script> 
<script type="text/javascript">
var jQuery = $.sub();
</script>
<script src="jquery.maskedinput.js" type="text/javascript"></script>
<script type="text/javascript">
var $$$ = jQuery;
jQuery = $;
</script>

Единственное возможное преимущество этого подхода состоит в том, что он может изолировать один плагин от изменений, которые может внести другой плагин в методы jQuery. Это немного запутанная, но единственная альтернатива изменению плагинов, о которой я могу думать.

Ответ 2

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

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

Альтернативой является вытащить один из плагинов, а затем сразу же загрузить патчер пространства имен, который просто делает, например, jQuery.fn.masked_input = jQuery.fn.mask;, а затем после этого можно загрузить плагин экспонирования. Этот подход будет работать до тех пор, пока переименованный плагин не будет ссылаться на свое имя в любом месте. И вам нужно будет запомнить определенный порядок загрузки для ваших плагинов. Такие вещи также происходят все время в разработке программного обеспечения.

Ответ 3

Ok. Теперь я отвечаю на свой вопрос.

Я считал, что mu слишком короткий подход, но он не совсем подходит. Мой коллега предложил следующее:

Мы создаем новый экземпляр jQuery следующим образом:

var $$$ = $.extend( true, function(selector, context) {
    return new $$$.fn.init( selector, context );
}, $);
$$$.fn = $$$.prototype = jQuery.prototype;

И мы создаем закрытие плагинов функции $ на нем (поскольку $ используется внутри плагина):

(function($) {
... plugin code goes here ...
$.fn.extend({
        myplugin: function(maybe_some_options) {
...
})($$$);

Теперь мы можем вызывать $$$(<selector>).myplugin( { do : 'great job', and : 'be happy' } ); и $(<selector>).myplugin() одновременно.

У нас нет проблем с этим подходом до сих пор, и я не вижу причин, по которым он сломался, поэтому мы решили пойти с этим решением.