Реальный поиск, пагинация, пустой ответ, ошибка и сохранённый выбор.
VGSelect сохраняет исходный <select> для формы и строит интерфейс рядом с ним.
Каждый пример запускается один раз после появления HTML. Параметры из data-* читаются при инициализации;
библиотека сама не сканирует страницу в поисках полей. По умолчанию модуль использует
position: 'auto': список выбирает сторону с большим свободным местом.
Оба примера используют тестовый GET endpoint /api/select/demo с параметрами
q, page и per_page. Это фиксированный справочник городов, а не production API.
Введите м для нескольких страниц, empty для пустого ответа или error для HTTP 503.
После ошибки введите ка, чтобы проверить восстановление. Индикатор загрузки виден на время запроса;
для его наблюдения можно включить ограничение скорости сети.
Поиск и «Загрузить ещё»
Три результата на страницу, задержка 300 мс. Журнал под полем показывает начало поиска, результат, пагинацию и ошибку. Сообщения журнала — UI демо, а не встроенный alert VGSelect.
HTML
<div class="select-demo">
<label for="select-remote">Удалённый поиск города</label>
<select id="select-remote" class="vg-select" name="remote_city" data-select-demo
data-placeholder="Введите м, empty или error">
<option value="" selected hidden></option>
</select>
<output id="select-remote-status" aria-live="polite">Откройте список и введите запрос.</output>
</div>
Калуга загружена заранее и помечена data-preserve. Введите «м»: сохранённая опция останется в списке при замене результатов. Для других выбранных значений такой гарантии нет без data-preserve.
Используйте уникальные строковые id. Для пустого ответа: results: [] и
total_pages: 1. Названия параметров в JavaScript — minterm и perpage,
в нижнем регистре. Сервер получает per_page. Поиск запускается вводом, не открытием списка.