Параметр searchFloor в библиотеке Choices.js
определяет минимальное количество символов, которое пользователь должен
ввести перед запуском поиска по элементам списка.
Этот параметр особенно важен при работе с большими наборами данных, динамической подгрузкой элементов и интерфейсами, где необходимо снизить количество лишних операций фильтрации.
Базовый пример:
const choices = new Choices('#cities', {
searchEnabled: true,
searchFloor: 3
});
В данном случае поиск начнёт работать только после ввода трёх символов.
Когда поле поиска активно, Choices.js отслеживает ввод текста внутри
внутреннего input-элемента. До достижения значения
searchFloor библиотека:
После достижения минимальной длины:
Например:
new Choices('#frameworks', {
searchEnabled: true,
searchFloor: 2
});
Поведение:
| Ввод | Поиск |
|---|---|
r |
не выполняется |
re |
выполняется |
rea |
выполняется |
По умолчанию:
searchFloor: 1
Это означает, что поиск начинается сразу после ввода первого символа.
Стандартное поведение подходит для:
При наличии сотен или тысяч элементов постоянная фильтрация после каждого символа может:
В таких случаях searchFloor обычно увеличивают.
Пример:
new Choices('#countries', {
searchEnabled: true,
searchFloor: 3
});
Такой подход уменьшает количество поисковых операций.
Параметр особенно полезен при интеграции с серверным поиском.
Без ограничения длины запроса пользователь может вызывать множество запросов:
a
ab
abc
abcd
Это приводит к:
Корректная настройка:
new Choices('#users', {
searchEnabled: true,
searchFloor: 3
});
Теперь запросы можно отправлять только после ввода минимум трёх символов.
Choices.js предоставляет событие search, которое можно
использовать для AJAX-загрузки.
Пример:
const element = document.querySelector('#users');
const choices = new Choices(element, {
searchEnabled: true,
searchFloor: 3
});
element.addEventListener('search', async (event) => {
const value = event.detail.value;
const response = await fetch(`/api/users?q=${value}`);
const users = await response.json();
choices.clearChoices();
choices.setChoices(
users,
'id',
'name',
true
);
});
В этом случае событие не будет вызываться до достижения минимальной длины.
Минимальная длина поиска напрямую влияет на удобство интерфейса.
searchFloor: 1
Проблемы:
searchFloor: 6
Проблемы:
На практике чаще всего используются:
| Тип данных | Рекомендуемое значение |
|---|---|
| Маленький список | 1 |
| Средний список | 2 |
| Большой список | 3 |
| Серверный поиск | 3–4 |
tags input)При использовании текстовых тегов минимальная длина поиска также применяется к поиску совпадений.
Пример:
new Choices('#tags', {
removeItemButton: true,
searchEnabled: true,
searchFloor: 2
});
Если пользователь вводит один символ:
j
подсказки не отображаются.
После:
js
начинается поиск совпадений.
searchResultLimitsearchFloor хорошо сочетается с ограничением количества
результатов.
Пример:
new Choices('#languages', {
searchEnabled: true,
searchFloor: 2,
searchResultLimit: 10
});
Здесь:
Такой подход уменьшает нагрузку на интерфейс.
shouldSortПри отключённой сортировке минимальная длина поиска помогает сохранить производительность.
new Choices('#products', {
searchEnabled: true,
shouldSort: false,
searchFloor: 3
});
Особенно полезно при работе с большими списками товаров.
После создания экземпляра Choices.js изменить
searchFloor напрямую нельзя через публичный API, однако
возможно пересоздать компонент.
Пример:
let choices = new Choices('#cities', {
searchFloor: 1
});
function updateSearchFloor(value) {
choices.destroy();
choices = new Choices('#cities', {
searchFloor: value
});
}
Иногда необходимо практически полностью отключить поиск до ввода полноценного слова.
Пример:
new Choices('#dictionary', {
searchFloor: 5
});
Это полезно:
noResultsTextПараметр влияет на отображение сообщения об отсутствии результатов.
Пример:
new Choices('#movies', {
searchEnabled: true,
searchFloor: 3,
noResultsText: 'Ничего не найдено'
});
Пока не введено три символа:
После запуска поиска сообщение появляется только при отсутствии совпадений.
Внутри события search можно анализировать длину запроса
вручную.
element.addEventListener('search', (event) => {
const value = event.detail.value;
if (value.length < 3) {
return;
}
console.log('Поиск:', value);
});
Это позволяет создавать дополнительную логику поверх
searchFloor.
Иногда локальный поиск полностью отключают, используя только серверную фильтрацию.
Пример:
new Choices('#employees', {
searchEnabled: true,
searchChoices: false,
searchFloor: 3
});
Здесь:
searchFloor при AJAXsearchFloor: 1
Результат:
searchFloor: 8
Проблема:
Например:
CSS
HTML
Vue
React
Большинство значений невозможно найти быстро.
Даже при наличии searchFloor желательно использовать
задержку запросов.
Пример:
let timeout;
element.addEventListener('search', (event) => {
clearTimeout(timeout);
timeout = setTimeout(() => {
console.log(event.detail.value);
}, 300);
});
Так уменьшается количество обращений к серверу.
const element = document.querySelector('#products');
const choices = new Choices(element, {
searchEnabled: true,
searchFloor: 3,
searchResultLimit: 20,
shouldSort: false,
noResultsText: 'Товары не найдены'
});
let timeout;
element.addEventListener('search', (event) => {
clearTimeout(timeout);
timeout = setTimeout(async () => {
const query = event.detail.value;
if (query.length < 3) {
return;
}
const response = await fetch(`/api/products?q=${query}`);
const data = await response.json();
choices.clearChoices();
choices.setChoices(
data,
'id',
'title',
true
);
}, 400);
});
В примере реализованы: