Плагины Jquery занимают одно и то же имя функции -> конфликт - PullRequest
12 голосов
/ 21 апреля 2011

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

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

Ответы [ 3 ]

13 голосов
/ 21 апреля 2011

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

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

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

3 голосов
/ 03 мая 2011

Я думаю, что согласен с ответом му.Одним из дополнений может быть использование jQuery.sub () .

Поскольку большинство плагинов используют глобальный jQuery во время сборки, вы должны иметь возможность использовать псевдоним 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.Это немного запутанная, но единственная альтернатива изменению плагинов, о которой я могу подумать.

0 голосов
/ 26 апреля 2011

Хорошо. Я отвечаю на свой вопрос сейчас.

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

Мы создаем новый экземпляр 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() одновременно.

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

...