Zepto — легковесная библиотека JavaScript, во многом совместимая с jQuery, но более компактная. Одной из сильных сторон Zepto является гибкая система расширений через плагины. Чтобы плагины не конфликтовали между собой и с основным функционалом библиотеки, используется namespace — пространство имён. Оно позволяет изолировать методы и события, предотвращая случайное переопределение или дублирование.
Namespace — это строковый идентификатор, который прикрепляется к событиям и методам плагинов. Формат записи следующий:
$('selector').on('click.myPlugin', function() {
console.log('Обработчик с namespace myPlugin');
});
click — тип события..myPlugin — namespace. Namespace может быть
любой строкой, включающей латинские буквы, цифры и
дефисы. Основное преимущество — возможность отдельно отключать
или управлять обработчиками по namespace, не затрагивая другие
события.Namespace особенно полезен для подключения нескольких плагинов к одному элементу. Например:
$('#button')
.on('click.slider', function() {
console.log('Слайдер сработал');
})
.on('click.tooltip', function() {
console.log('Появилась подсказка');
});
Отключение одного из обработчиков не затрагивает остальные:
$('#button').off('click.slider'); // отключает только слайдер
$('#button').off('click.tooltip'); // отключает только подсказку
Использование namespace предотвращает непреднамеренное удаление событий других плагинов.
Структура плагина в Zepto обычно строится вокруг расширения объекта
$.fn. Пример плагина с namespace:
(function($) {
$.fn.highlight = function(options) {
var settings = $.extend({
color: 'yellow',
namespace: 'highlight'
}, options);
return this.each(function() {
var $el = $(this);
// Привязка события с namespace
$el.on('mouseenter.' + settings.namespace, function() {
$el.css('background-color', settings.color);
});
$el.on('mouseleave.' + settings.namespace, function() {
$el.css('background-color', '');
});
});
};
})(Zepto);
// Использование
$('.item').highlight({ color: 'lightblue' });
В этом примере:
highlight, помещены
в namespace highlight.$('.item').off('.highlight');
Namespace удобно применять при обновлении параметров плагина без
пересоздания элемента. Вместо того чтобы вручную удалять старые
обработчики, можно использовать .off(namespace):
var $box = $('.box');
// Инициализация с namespace
$box.on('click.drag', function() {
console.log('Перетаскивание');
});
// Обновление параметров: отключение старого обработчика
$box.off('.drag').on('click.drag', function() {
console.log('Перетаскивание с новыми настройками');
});
Такой подход делает плагины модульными, гибкими и безопасными.
Пример объединения нескольких событий в один namespace:
$('.menu').on('mouseenter.menu mouseleave.menu', function() {
$(this).toggleClass('open');
});
Отключение всех событий меню одной командой:
$('.menu').off('.menu');
Помимо событий, namespace может использоваться для разделения методов плагина, особенно когда один элемент использует несколько плагинов, и есть риск пересечения методов:
$.fn.tooltip = function(options) {
var namespace = options.namespace || 'tooltip';
this[namespace] = {
show: function() { console.log('Показать подсказку'); },
hide: function() { console.log('Скрыть подсказку'); }
};
return this;
};
// Использование
$('#btn').tooltip({ namespace: 'tooltipA' });
$('#btn').tooltip({ namespace: 'tooltipB' });
$('#btn').tooltipA.show();
$('#btn').tooltipB.show();
Такой подход позволяет поддерживать несколько плагинов с идентичными методами на одном элементе без конфликта имён.
Namespace в Zepto является ключевым инструментом для безопасного масштабирования плагинов, управления событиями и методов. Его использование делает код более предсказуемым, модульным и легко поддерживаемым.