Жизненный цикл, callbacks, DOM-события и публичные CSS-переменные.
VGSelect сохраняет исходный <select> для формы и строит интерфейс рядом с ним.
Каждый пример запускается один раз после появления HTML. Параметры из data-* читаются при инициализации;
библиотека сама не сканирует страницу в поисках полей. По умолчанию модуль использует
position: 'auto': список выбирает сторону с большим свободным местом.
Методы, callbacks и DOM-события
Установите значение, откройте список, уничтожьте интерфейс и создайте его заново. После destroy остаётся обычный select. Журнал ограничен последними 12 сообщениями.
Нажмите «Оранжевый»: ссылка найдёт связанный select в document по data-select-target и выберет option по value. Ссылка не обязана находиться рядом с полем.
/**
* Описание: выбор значения VGSelect по внешней ссылке.
* Возможности: поиск связанного select в document по data-select-target и выбор по value.
*/
import {VGSelect} from 'vgapp';
function initSelectDemo() {
const select = document.querySelector('#select-linked-color');
if (!select || select.dataset.inited === 'true') return;
VGSelect.init(select);
select.addEventListener('change', () => {
document.querySelector('#select-linked-value').textContent = 'Значение: ' + select.value;
});
document.querySelectorAll('a[data-select-target="#select-linked-color"]').forEach(link => {
link.addEventListener('click', event => {
event.preventDefault();
// Ссылка и поле могут находиться в разных частях страницы.
const target = document.querySelector(link.dataset.selectTarget);
if (!(target instanceof HTMLSelectElement) || target.disabled) return;
VGSelect.changeSelector(target, link.dataset.selectValue);
});
});
}
initSelectDemo();
Размер задают публичные CSS-переменные, data-position="top" открывает список вверх. Проверьте переключатель темы в шапке: состояние темы принадлежит OKAUX.
/**
* Описание: рабочий пример VGSelect — theme.
* Возможности: инициализация и демонстрация публичного контракта на исходном select.
*/
import {VGSelect} from 'vgapp';
function initSelectDemo() {
const select = document.querySelector('#select-theme');
if (!select || select.dataset.inited === 'true') return;
VGSelect.init(select); // Цвета наследуются от общего адаптера vgapp/theme.
}
initSelectDemo();
autosearch: true — порог 7; число — свой порог; false — отключить автоматику. search.enabled / search.remote
включают поиск независимо от порога. search.delay: 300, minterm: 1, perpage: 20. Для AJAX используйте GET.
Направление
position: auto (по умолчанию), none, top, bottom. auto выбирает сторону с большим свободным местом в
ближайшем overflow-контейнере или viewport. none оставляет позиционирование CSS. Выпадающий список не
переносится в body.
Выбор
VGSelect.changeSelector(select, value, data); для multiple передайте {selected: false}, чтобы снять выбор.
changeSelectorByIndex(select, index, data) подходит для option без value. updateUI(select) синхронизирует
интерфейс после прямой смены selected.
Данные
VGSelect.addOptions(select, arrayOrResults, {preserve: false}) заменяет обычные опции, сохраняя пустые и
data-preserve. preserve: true добавляет данные без дедупликации. Поддерживаются id, text, selected,
disabled, children; дополнительные поля становятся data-*.
Жизненный цикл
instance.show(), hide(), toggle(); VGSelect.destroy(select) освобождает экземпляр и восстанавливает нативное
поле. Для новой конфигурации вызывайте init повторно. MutationObserver видит DOM-изменения, но не
присваивание select.value.
Локализация
lang берётся из html[lang], по умолчанию ru. Например, lang: 'en' меняет подписи поиска и загрузки.
Placeholder передавайте через data-placeholder на select.
События и callbacks
Исходный select
Нативный change и vg.select.change. Значения формы читайте через value / selectedOptions. Для программного
выбора vg.select.change отправляется только при выборе ранее не выбранной опции.
Обёртка
vg.select.init, show, shown, open, hide, hidden, close, select, deselect, clear, search, rebuild, loadNext,
error. События всплывают; данные находятся в event.detail. show / hide можно отменить через
preventDefault().
Callbacks
onInit, onShow, onHide, onSelect, onDeselect, onClear, onSearch, onLoadNext получают (wrapper, data), this —
экземпляр. onSearch вызывается при вводе и после ответа, payload различается. У onChange есть параметр по
умолчанию, но вызова в текущем исходнике нет: используйте change. onClear относится к удалению последнего
тега multiple.
Границы контракта
Не обещаем полный ARIA listbox: текущая реализация поддерживает открытие Enter / Space / ArrowDown, но не
полноценную клавиатурную навигацию по опциям. У пустого AJAX-ответа нет встроенного текстового сообщения;
его показывает журнал примера.
CSS-переменные
Текущее значение
--vg-select-current-background-color, color, border-width/style/color/radius, padding-left/right/top/bottom,
font-size, line-height. Placeholder: --vg-select-current-placehoder-color (написание в API именно
placehoder).
Выпадающий список
--vg-select-dropdown-background-color, color, border-*, box-shadow, z-index; --vg-select-list-max-height,
scrollbar-width/bg/thumb. При position не равном none высотой списка управляет JS.
Демо использует установленный OKAUX 1.0.2. Общий адаптер vgapp/theme уже подключён к [data-theme="light"] /
[data-theme="dark"]. Отдельное хранилище темы не создаётся.