Nativní podpora přístupnosti AJAXu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
cj_neti
Člen | 2
+
0
-

V souvislosti s naší prezentací na Poslední sobotě bych rád otevřel téma týkající se AJAXu v Nette.

Jak je popsáno v úvodním článku seriálu o WAI-ARIA na Zdrojáku, vyskytují se v dynamických webových aplikacích tři potencionální úskalí. Existují dva aspekty, které aplikace postavená na Nette může řešit:

  1. Napovědět na základě kódu šablony (bloky, komponenty, snippety), kde uvádět nadpisy a atributy WAI-ARIA pro specifikování účelu daného bloku stránky. – více o struktuře – Nette principielně nemůže vkládání nadpisů a rolí ovlivnit, takže iniciativa je na straně kodéra. Stejně tak nemůže ovlivnit, vyznačení živých oblastí atributem aria-live, i když o tom lze již diskutovat.
  2. Nette by však mohlo ovlivnit chování stránky při přijmutí AJAXového požadavku do prohlížeče a to tak, že nafokusuje relevantní oblast stránky, která s provedeným AJAXovým požadavkem bezprostředně souvisí.

Kód ideálního snippetu, který zobrazuje krátké textové zprávy jako např. flash zprávičky, by mohl vypadat takto:

<div n:snippet="flashes" role="alert">
{if !empty($flashes)}
<h2>Zprávy</h2>
...
{/if}
</div>

Specifikace WAI-ARIA říká, že role alert má implicitní hodnotu atributu aria-live nastavenou na assertive, tj. každá invalidace snippetu, jež vyvolá načtení jeho nového obsahu, zároveň vyvolá i automatické přečtení jeho obsahu odečítačem.

Když bylo řečeno, že Nette by mohlo ovlivnit vyznačení živých oblastí, tak byl myšlen následující koncept:

  1. Nemá-li element s atributem n:snippet také atribut role, vygeneruje se atribut role automaticky s hodnotou region.
  2. Neobsahuje-li snippet uvnitř žádný odkaz na signál, vygeneruje se automaticky k elementu snippetu atribut aria-live s hodnotou polite.

Takové přiřazení atributu aria-live je asi příliš magické a navíc je otázkou, zda makrav šablonách lze stavět tak, aby generovala svůj kód na základě obsahu, jenž obklopují. O přidělení atributu aria-live by se na druhou stranu mohl starat i obslužný Javascript na straně klienta mající na starost promítnutí dat z JSON odpovědi se snippety do stránky, kde pomocí JQuery zjíštění, zda v obsahu elementu je nějaký fokusovatelný element, není velký problém.

Řízení toku fokusu je věc, která by výrazně mohla aplikaci zpřehlednit,jde však o to, jak toho dosáhnout. V zásadě je několik možností:

  1. Specifikování snippetu, jenž se má fokusovat, nějakým způsobem přímo v odkazu na signál (makro link). Takový mechanismus by se pak nejspíš musel kombinovat s třetí variantou, aby obslužný Javascript věděl, kam fokus přesunout. Rovněž by šlo pro uchování jména snippetu, na nějž by se po vykonání signálu měl předat fokus, mohlo využít speciálního HTML5 data- atributu.
  2. Vyčlenění speciálního HTML5 data- atributu pro určení priority snippetu, kterou by následně mohl použít obslužný javascript načítající snippety do stránky k tomu, aby přesunul fokus na snippet s nejvyšší prioritou.
  3. Rozšířit invalidaci snippetů tak,aby při volání invalidateControl() bylo možné implicitně říct, který snippet má získat fokus. Tato informace by se musela přenášet ve výsledném JSON z presenteru a musel by ji zpracovat obslužný Javascript a zajistit přesunutí fokusu na příslušný snippet.

Fokusování snippetu by potom probíhalo na straně klienta tak, že v daném snippetu by se nalezl první fokusovatelný prvek a přesunul se na něj fokus.

Je možné, že pro řešení výše zmíněných přístupnostních řešení, jež by Nette mohlo v sobě integrovat, existuje více možností a navíc elegantních možností, proto přijďte s vlastním návrhem, i když specifikaci WAI-ARIA nebo princip funkce odečítačů neznáte. Určitě se lze dobrat kompromisu, jenž bude reflektovat jak filozofii Nette, tak poměrně komplexní záběr doporučení WAI-ARIA a nemalé možnosti asistivních technologií.

Díky předem za jakýkoli návrh.