• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Challenge JS/DOM

Object Storage Arubacloud
+14 głosów
1,675 wizyt
pytanie zadane 20 maja 2015 w Nasze poradniki przez Comandeer Guru (600,710 p.)
edycja 21 maja 2015 przez Comandeer

Był już challenge C++ (a nawet dwa ;)), był już challenge PHP… Czego brakuje? Oczywiście challenge'u JS! Chociaż to nie będzie taki czysty JS, tylko bardziej DOM, a więc dużo HTML5 i ARIA… Ale do rzeczy:

Jak wygląda pole select w formularzu każdy dobrze wie. Ale oczywiście klient jest niezadowolony z jego wyglądu, bo nie pasuje do reszty bombastycznej strony. Rozwiązania typu http://lea.verou.me/2011/03/custom-select-drop-downs-with-css3/ odpadają w przedbiegach, bo ostylowana ma być również lista, która się pokazuje po kliknięciu w pole. Zatem zostaje jedynie napisanie tego od podstaw.
I tutaj są dwa haczyki. Pierwszy: klient dostanie 800k zł dotacji z Unii, ale jedynie pod warunkiem, że strona będzie całkowicie dostępna dla wszystkich niepełnosprawnych i wykluczonych technologicznie (o użytkownikach mobilnych nie wspominając!). To de facto pociąga za sobą konieczność zmapowania 1:1 natywnego select i zapewnienia działania bez JS. Wypada się zaznajomić z ARIA oraz sposobem obsługi select z poziomu klawiatury. Drugi: pole to musi się normalnie przesyłać formularzem.
Na szczęście klient nie używa select[multiple], więc o tyle dobrze.

Podsumowując: należy odtworzyć pole typu select używając do tego HTML, CSS, JS i ARIA tak, żeby działało dokładnie tak samo, było rozpoznawane przez programy typu NVDA jako odpowiedniki select i dodatkowo, żeby można było ostylować każdy element tego pola.

Garść wskazówek:

  • Celem zadania jest odtworzenie takiego pola http://www.kurshtml.edu.pl/html/lista_rozwijalna,formularze.html przy użyciu HTML, CSS, JS i ARIA. Przykładowe rozwiązanie tego zadania (od razu uprzedzam, że nie jest poprawne) wygląda tak: http://www.forumweb.pl/javascript/szukam-zadan-do-nauki-javascript/495060#495060 (a pod spodem lista rzeczy, na które warto zwrócić uwagę ;))
  • Kwestia działania bez JS - są dwie szkoły. Pierwsza, o wiele łatwiejsza, to po prostu pokazanie normalnego select tym, którzy nie mają JS. Druga szkoła sugeruje takie napisanie tego pola, żeby JS de facto nie był wgl potrzebny (a przynajmniej jego rola sprowadzała się do kwestii typu obsługa klawiatury). Co do drugiej szkoły, mam taką oto podpowiedź: http://bzdety.comandeer.pl/no-js.html
  • Kwestia obsługi klawiaturą. Polecam pobawić się tym polem na stronach KursHTML.edu.pl. Co się dzieje gdy naciskamy strzałkę w dół, w górę, spację itd (warto to sprawdzić zarówno dla rozwiniętego, jak i zwiniętego pola!). Co więcej - wszystkie pola formularzy reagują na TAB, więc nasze też musi. Wypada więc poczytać sobie o atrybucie [tabindex] ;)
  • Kwestia wysyłania razem z formularzem. Znów są dwie szkoły. Pierwsza to po prostu napisanie prostej funkcji w JS, która by obslugiwała nasze pole i wszystkie zmiany w nim przenosiła na oryginalne pole select. Druga szkoła - znów odsyłam do http://bzdety.comandeer.pl/no-js.html ;)
  • Kwestia stylowalności, czyli nagle chce mieć pole zielone, a nie czerwone i ma być to prosta czynność. Innymi słowy: cały wygląd najlepiej zamknąć w klasach CSS. Osobiście kierowałbym się tutaj metodologią BEM: https://en.bem.info/method/ ale w gruncie rzeczy nie jest to wgl istotne. Grunt, żeby cały wygląd dało się ustalić przez CSS. To wiąże się np także z tym, że rozwinięcie pola = nadanie mu klasy .open lub podobnej
  • Kwestia dostępności - a więc "killer ficzer" zadania ;) Polecam tutaj zapoznać się z programem NVDA (http://www.nvaccess.org/) i posłuchać (tak, posłuchać) w jaki sposób przedstawia on pole select userowi - to jest ideał, do którego dążymy. Takie wyniki osiągnąć można tylko dzięki użyciu ARIA - odpowiednie przykłady znaleźć można na stronie OpenAjax Alliance (http://oaa-accessibility.org/examples/). Nie ukrywam, że jest to najtrudniejsza część zadania… ale bez niej to nie byłby challenge ;)

Dla bardzo ambitnych i tych, którym się bardzo nudzi: a może by tak opakować to w Web Components? ;) Krótki overview tej technologii: http://webroad.pl/javascript/3505-web-components + przykładowe komponenty (akurat oparte na Polymerze, też opisanym w tym artykule): https://github.com/Comandeer/dGUI http://dgui.comandeer.pl
Nie ukrywam, że tego typu rozwiązaniem jestem zainteresowany osobiście ;)

Powiedzmy sobie szczerze - to zadanie iście szatańskie i jeden z trudniejszych challenge'ów jeśli chodzi o JS/DOM w polskiej Sieci. Dodam jeszcze, że na razie poprawne rozwiązanie nie powstało (ale istnieje ;)).

2 odpowiedzi

0 głosów
odpowiedź 4 grudnia 2015 przez event15 Szeryf (93,790 p.)
Zadanie szacun, powiem szczerze że mega trudne.
komentarz 4 grudnia 2015 przez Eryk Andrzejewski Mędrzec (164,260 p.)
No jak nikt od maja tego nie zrobił, to jest trudne :D
komentarz 4 grudnia 2015 przez event15 Szeryf (93,790 p.)
edycja 4 grudnia 2015 przez Eryk Andrzejewski
# Due to limitations with interleave, handling single/multiple selection
# enforcement in RELAX NG seems to be possible but really awkward.
# Tried it. Leaving it to Schematron.

## Select menu option: <option selected>

	option.elem =
		element option { option.inner & option.attrs }
	option.attrs =
		(	common.attrs
		&	common-form.attrs.disabled?
		&	option.attrs.selected?
		&	option.attrs.label?
		&	option.attrs.value?
		&	(	common.attrs.aria.implicit.option
			|	common.attrs.aria.role.option
			|	common.attrs.aria.role.menuitem
			|	common.attrs.aria.role.menuitemradio
			|	common.attrs.aria.role.menuitemcheckbox
			|	common.attrs.aria.role.presentation
			)?
		)
		option.attrs.selected =
			attribute selected {
				w:string "selected" | w:string ""
			}
		option.attrs.label =
			attribute label {
				form.data.nonemptystring
			}		
		option.attrs.value =
			attribute value {
				string
			}		
	option.inner =
		( text )

## Option Group: <optgroup>

	optgroup.elem =
		element optgroup { optgroup.inner & optgroup.attrs }
	optgroup.attrs = 
		(	common.attrs
		&	optgroup.attrs.label
		&	common-form.attrs.disabled?
		&	(	common.attrs.aria.role.presentation
			|	common.attrs.aria.role.menuitem
			)?
		)
		optgroup.attrs.label =
			attribute label {
				string
			}
	optgroup.inner =
		(	option.elem*
		&	common.elem.script-supporting*
		)

## Selection Menu: <select>

	select.elem =
		element select { select.inner & select.attrs }
	select.attrs =
		(	common.attrs
		&	common-form.attrs
		&	select.attrs.size?
		&	select.attrs.multiple?
		# FIXME onfocus, onblur, onchange
		&	(	common.attrs.aria.implicit.listbox
			|	common.attrs.aria.role.listbox # aria-multiselectable depends on "multiple" value; check in assertions
			|	common.attrs.aria.role.menu
			|	common.attrs.aria.role.presentation
			|	common.attrs.aria.role.menuitem
			)?
		)
		select.attrs.size =
			attribute size {
				common.data.integer.positive
			}
		select.attrs.multiple =
			attribute multiple {
				w:string "multiple" | w:string ""
			}
	select.inner =
		(	optgroup.elem*
		&	option.elem*
		&	common.elem.script-supporting*
		)

	common.elem.phrasing |= select.elem

Coś takiego żem znalazł ale nie wiem czy to w ogóle odpowiedź na cokolwiek.

komentarz 4 grudnia 2015 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Nie zmieniłeś kolorowania składni na JS xD
komentarz 4 grudnia 2015 przez event15 Szeryf (93,790 p.)

Wyciągnąłem to z PHPStorma ze schemy html5. Miało to rozszerzenie *.rnc więc to nie js. Ale ciekawa podróż po budowie czegoś takiego. 

Wujek pokierował mnie do tego: Relax NG Compact Syntax

komentarz 4 grudnia 2015 przez Comandeer Guru (600,710 p.)
To jest XML-owy odpowiednik DTD, równie nieużyteczny...
0 głosów
odpowiedź 28 marca 2018 przez kordix Gaduła (3,910 p.)
Komukolwiek udało się w ogóle to zrobić? Można gdzieś znaleźć rozwiązanie?
komentarz 28 marca 2018 przez Comandeer Guru (600,710 p.)
Myślę, że nikt nawet nie próbował tego robić. Częściowe rozwiązanie można znaleźć w specyfikacji "ARIA Practices".
komentarz 28 marca 2018 przez niezalogowany

Myślę, że nikt nawet nie próbował tego robić

Próbował : D Jeszcze z pół roku i opiszę to na blogu

Podobne pytania

+7 głosów
3 odpowiedzi 535 wizyt
0 głosów
1 odpowiedź 231 wizyt
pytanie zadane 10 września 2019 w JavaScript przez michal_php Stary wyjadacz (13,700 p.)
0 głosów
0 odpowiedzi 175 wizyt
pytanie zadane 29 października 2017 w JavaScript przez lapacz.kornel Mądrala (6,930 p.)

92,538 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,923 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...