Součástí HTML5 je element datalist. Těší se široké podpoře v prohlížečích a jednoduše řeší typický UX problém. Přesto se s ním na webu setkáte jenom zřídka. Kromě vysvětlení k čemu je dobrý jsem pro vás připravil i užitečný tag helper.

K čemu slouží datalist

Element datalist je sám o sobě neviditelný (nevizuální) element, který slouží k "nakrmení" autocomplete pro textové vstupní pole, které je na něj navázáno pomocí atrubutů id a list. Celá konstrukce vypadá nějak takto:

<input type="text" list="mujdatalist" />
<datalist id="mujdatalist">
    <option value="aaa" />
    <option value="bbb" />
    <option value="ccc" />
</datalist>

Hodnoty z datalistu budou uživateli nabídnuty při zadávání textu do prvku input. Jak konkrétně, to záleží na prohlížeči, ale typicky se po poklepání zobrazí úplný seznam (jako rozbalovací) a při psaní textu se zobrazí seznam filtrovaný, obsahující pouze položky odpovídající již napsanému.

Jedná se tedy o aproximaci prvku, kterému se při návrhu UI obvykle říká ComboBox, protože kombinuje běžné textové pole (textbox) a seznam (dropdown list). Uživatel si může buďto vybrat hodnotu ze seznamu nebo zadat vlastní.

Další informace najdete příkladmo na MDN.

Kdy použít combobox

Baymard Institute na svém webu publikoval studii použitelnosti výběru ze seznamů. Obecné závěry studie jsou následující:

Typickým příkladem posledního typu je třeba seznam zemí při výběru adresy a podobně.

Výhody a nevýhody použití prvku datalist

Výhody:

Nevýhody:

Výhodou i nevýhodou může být - v závislosti na způsobu použití - že uživatel si nemusí vybrat z nabízených možností ale může napsat libovolný vlastní text. Pokud je žádoucí výběr z pevného seznamu možností, je nutné provést validaci textové hodnoty.

Tag helper

Od verze 1.8 je součástí mé knihovny Altairis.TagHelpers nový helper DatalistTagHelper. Funguje tak, že se prvku input přidá nový atribut list, který odkazuje na vlastnost modelu nebo viewmodelu, která je typu IEnumerable<string> a obsahuje nabízené hodnoty. Tag helper automaticky vygeneruje odpovídajíci datalist a naváže ho na textové pole.

Jeho ID bude vygenerováno automaticky podle ID textového pole, ale lze jej i explicitně určit pomocí atributu datalist-id.

Kompletní dokumentaci najdete tradičně na wiki.