Микроразметка в интерфейсных компонентах выбора данных представляет
собой способ обогащения DOM-структуры дополнительной семантикой, которая
сохраняется при трансформации стандартного <select> в
интерактивный компонент. В библиотеке Tom Select это приобретает
практическое значение, поскольку исходный HTML-элемент заменяется на
сложную структуру, где важна передача метаданных, атрибутов и
структурированных данных между состояниями «исходный select → внутреннее
представление → пользовательский интерфейс → сериализация формы».
<option>Базовый HTML <option> поддерживает ограниченный
набор атрибутов, однако в реальных приложениях часто требуется
передавать дополнительные поля:
Tom Select при инициализации считывает DOM-структуру и преобразует
<option> в внутренний объект вида:
{
value: "123",
text: "Product name",
$order: 1,
custom_field: "..."
}
Расширение этого объекта достигается через:
data-* атрибутыdataAttr конфигурациюcreate, load, parseНаиболее устойчивый механизм передачи микроразметки — использование
data-* атрибутов в <option>:
<select id="select">
<option value="1" data-category="books" data-rating="4.8" data-sku="A-991">
Clean Code
</option>
</select>
При инициализации Tom Select эти значения могут быть извлечены и включены в объект опции:
new TomSelect("#select", {
dataAttr: "data-*"
});
Результатом становится расширенный набор полей внутри объекта опции, доступных в шаблонах отображения.
Tom Select активно использует шаблоны:
optionitemoption_createМикроразметка становится доступной внутри этих шаблонов через объект данных:
new TomSelect("#select", {
render: {
option: function(data, escape) {
return `
<div class="option">
<span class="title">${escape(data.text)}</span>
<span class="meta">${escape(data.category)}</span>
<span class="rating">${escape(data.rating)}</span>
</div>
`;
}
}
});
Таким образом, data-* поля становятся частью визуального
слоя, но не теряются при сериализации.
В случаях, когда data-* недостаточно, применяется явное
расширение данных через API загрузки:
new TomSelect("#select", {
load: function(query, callback) {
fetch("/api/items?q=" + encodeURIComponent(query))
.then(res => res.json())
.then(data => {
callback(data.items.map(item => ({
value: item.id,
text: item.name,
category: item.category,
seo: item.slug,
analytics: {
position: item.position,
source: item.source
}
})));
});
}
});
Такой подход превращает микроразметку в полноценную структуру данных, не ограниченную HTML.
Опция dataAttr управляет тем, какие атрибуты считываются
из DOM:
data-*Пример строгого контроля:
new TomSelect("#select", {
dataAttr: "data-category,data-rating,data-sku"
});
Это позволяет ограничить поверхность данных и избежать попадания лишней информации в модель компонента.
При использовании AJAX-источников структура данных становится единственным носителем микроразметки. В таких сценариях важно разделять:
text)Пример структурирования:
{
value: "42",
text: "Item name",
meta: {
category: "electronics",
brand: "XCorp"
},
schema: {
type: "Product",
id: "https://example.com/item/42"
}
}
Микроразметка может включать данные формата schema.org, особенно в случаях, когда выпадающий список используется для выбора сущностей каталога.
Пример интеграции:
render: {
option: function(data, escape) {
return `
<div itemscope itemtype="https://schema.org/Product">
<span itemprop="name">${escape(data.text)}</span>
<meta itemprop="sku" content="${escape(data.value)}">
<span itemprop="category">${escape(data.category)}</span>
</div>
`;
}
}
В этом случае Tom Select выступает не только как UI-компонент, но и как контейнер для структурированных данных, сохраняемых в DOM.
При отправке формы Tom Select преобразует выбранные значения обратно
в стандартный формат <select>. Однако дополнительные
данные не сериализуются автоматически.
Для сохранения микроразметки применяются стратегии:
changeПример синхронизации:
const select = new TomSelect("#select");
select.on("change", function(values) {
const items = values.map(v => select.options[v]);
document.querySelector("#payload").value = JSON.stringify(items);
});
Внутренне Tom Select различает:
<option>optionsitemsitem и dropdown optionМикроразметка может быть привязана к каждому уровню:
Типичная проблема заключается в том, что кастомные поля исчезают при
повторном создании экземпляра или при обновлении данных через
setValue.
Причины:
addOptionКорректный подход:
select.addOption({
value: "10",
text: "Name",
category: "books",
rating: 5
});
Некоторые плагины изменяют поведение DOM и могут влиять на сохранение данных:
remove_buttoncheckbox_optionsvirtual_scrollПри их использовании важно учитывать, что DOM-слой становится
вторичным по отношению к объектной модели, поэтому микроразметка должна
храниться в options, а не в HTML.
При работе с каталожными интерфейсами микроразметка часто принимает форму вложенных объектов:
{
value: "1001",
text: "Laptop Pro",
attributes: {
cpu: "M-series",
ram: "16GB",
storage: "512GB"
},
seo: {
title: "Laptop Pro 16GB",
url: "/products/1001"
},
analytics: {
impression_id: "abc123",
campaign: "winter_sale"
}
}
Такой подход обеспечивает разделение ответственности между слоями:
textattributesseoanalyticsПри масштабных приложениях возникает необходимость валидации микроразметки:
Часто используется схема-валидация до передачи в Tom Select, поскольку библиотека не накладывает строгих ограничений на структуру объектов.
Сложные интерфейсы используют Tom Select как слой агрегации данных:
Во всех случаях микроразметка становится не дополнением, а основной моделью данных, на основе которой строится поведение компонента и внешний API формы.