#jquery #jquery-plugins #namespaces
#jquery #jquery-плагины #пространства имен
Вопрос:
Я столкнулся с проблемой, используя плагин jquery expose вместе с плагином Masked Input. Проблема в том, что они оба занимают $.mask
функцию, которая приводит к конфликту. Но мне жизненно необходимо, чтобы эти два плагина работали вместе. Я бы переименовал $.mask
в одном из них … скажем, $.msk
, но в этом случае мне всегда нужно будет помнить это, и если я захочу перейти на новую версию, я переименую снова.
Ищете лучшее решение о том, как справляться с такого рода конфликтами между плагинами jquery.
Комментарии:
1. Можете ли вы попросить авторов плагинов переименовать функцию? Это пойдет на пользу вам, им и сообществу.
2. Я постараюсь это сделать. Когда я читал руководство по созданию плагина jQuery, там было сказано, что разработчикам следует избегать присвоения плагину имени, которое, возможно, может быть использовано другими разработчиками плагинов. docs.jquery.com/Plugins/Authoring#Namespacing
3. @SlavaGu Я не получил ответа
Ответ №1:
Я думаю, у вас есть выбор между решениями, которые требуют от вас запоминания чего-либо, вопрос в том, как часто вы хотите запоминать.
Если вы переименуете один из них, вам нужно не забыть исправить любые обновления. Я не думаю, что это такая уж большая проблема, это происходит постоянно при разработке программного обеспечения.
Альтернативой является подключение одного из плагинов, а затем немедленная загрузка средства исправления пространства имен, которое просто выполняет, например, jQuery.fn.masked_input = jQuery.fn.mask;
, после чего может быть загружен плагин expose. Этот подход будет работать до тех пор, пока переименованный плагин нигде не ссылается на свое собственное имя. И вам нужно будет запомнить конкретный порядок загрузки ваших плагинов. Такого рода вещи также постоянно происходят при разработке программного обеспечения.
Комментарии:
1. Спасибо за ответ. Извините, я не могу принять ваш ответ, но он заслуживает, по крайней мере, одобрения. Боюсь, вы были правы — мне в любом случае придется вспомнить что-то из моего разума, касающееся этого плагина, в следующий раз, когда я захочу его обновить.
Ответ №2:
Я думаю, что согласен с ответом mu. Одним из дополнений может быть использование 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. Это немного запутанно, но единственная альтернатива изменению плагинов, о которой я могу думать.
Комментарии:
1. При обновлении до версии jQuery v1.8 следует помнить одну вещь,
jQuery.sub
которая устарела в jQuery v1.7 и не будет доступна в версии v1.8.
Ответ №3:
ОК. Сейчас я отвечаю на свой вопрос.
Я рассмотрел подход mu is too short, но он не совсем подходит. Мой коллега предложил следующее:
Мы создаем новый экземпляр 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()
одновременно.
Пока у нас нет проблем с этим подходом, и я не вижу причин, по которым он мог бы сломаться, поэтому мы решили придерживаться этого решения.
Комментарии:
1. Это сработает, но теперь у ваших клиентов в памяти есть две копии jQuery, и вы должны помнить (все время), какую версию jQuery использовать для каких плагинов. Вы заставляете своих клиентов платить за память, а не следовать простым процедурам обновления и тестирования.
2. лучше не перезаписывать метод init() , вместо этого будет лучше использовать sub().