Featherlight — это лёгкая библиотека для создания модальных окон на основе jQuery. Одной из ключевых возможностей является расширяемость через фильтры, которые позволяют вмешиваться в процесс открытия, закрытия и обработки содержимого модального окна. Фильтры дают полный контроль над поведением Featherlight без необходимости изменять исходный код библиотеки.
Фильтр в Featherlight — это функция, которая выполняется на
определённом этапе жизненного цикла модального окна. Каждый
фильтр имеет уникальное имя и может быть зарегистрирован глобально через
$.featherlight.registerFilter(name, function).
Сигнатура фильтра выглядит так:
$.featherlight.registerFilter('имяФильтра', function(content) {
// content — исходный HTML или объект jQuery
return content; // Возвращает модифицированный контент
});
content — это содержимое модального окна, которое может
быть HTML-строкой, jQuery-объектом или DOM-узлом.content будет использована при рендеринге окна.Featherlight предоставляет несколько встроенных этапов, на которых можно применять фильтры:
Пример фильтра, который добавляет обёртку вокруг контента:
$.featherlight.registerFilter('wrapContent', function(content) {
var $wrapper = $('<div class="custom-wrapper"></div>');
$wrapper.append(content);
return $wrapper;
});
Применение фильтра к модальному окну:
$.featherlight($('#myContent'), {
filters: ['wrapContent']
});
Важно: порядок фильтров имеет значение. Если назначено несколько
фильтров, они будут применяться последовательно в том порядке, в котором
указаны в массиве filters.
Фильтры можно применять глобально ко всем модальным
окнам. Для этого регистрируют фильтр и добавляют его к
$.featherlight.defaults.filters:
$.featherlight.registerFilter('addTimestamp', function(content) {
var $content = $(content);
var timestamp = $('<div class="timestamp"></div>').text(new Date().toLocaleString());
$content.append(timestamp);
return $content;
});
$.featherlight.defaults.filters.push('addTimestamp');
После этого каждый вызов Featherlight автоматически пропустит контент
через фильтр addTimestamp.
Featherlight поддерживает асинхронные операции внутри
фильтров. Если фильтр возвращает Promise,
Featherlight дождётся его выполнения:
$.featherlight.registerFilter('loadAsync', function(content) {
return $.ajax({
url: '/data/content.html',
method: 'GET'
}).then(function(response) {
return response;
});
});
Такой подход позволяет подгружать контент с сервера непосредственно перед открытием модального окна, не блокируя интерфейс.
Фильтры могут получать не только контент, но и параметры окна, что расширяет их функциональность:
$.featherlight.registerFilter('highlight', function(content, settings) {
var $content = $(content);
if (settings.highlightColor) {
$content.css('background-color', settings.highlightColor);
}
return $content;
});
$.featherlight($('#myContent'), {
filters: ['highlight'],
highlightColor: '#ffeb3b'
});
Таким образом, один фильтр может быть универсальным и настраиваемым
через объект settings.
Featherlight позволяет использовать несколько фильтров одновременно, создавая цепочку преобразований:
$.featherlight.registerFilter('addBorder', function(content) {
return $('<div class="bordered"></div>').append(content);
});
$.featherlight.registerFilter('addPadding', function(content) {
return $('<div class="padded"></div>').append(content);
});
$.featherlight($('#myContent'), {
filters: ['addBorder', 'addPadding']
});
Контент сначала оборачивается в .bordered, а затем в
.padded. Такой подход позволяет строить гибкие и
переиспользуемые комбинации фильтров.
Фильтры в Featherlight обеспечивают гибкое управление контентом и поведением модальных окон, позволяя создавать сложные интерфейсы с минимальным вмешательством в саму библиотеку.