Při zkoumání Acid 3 testu jsem včera objevil pro mne šokující věc.
Představme si jednoduchý kód:
<input id=„btn“ type=„submit“ onclick=„alert(‚Událost‘)“>
Asi nic, nad čím by někdo přemýšlel. Ale pokračujme. Na tlačítku zavoláme metodu click (tou je vyvolán stisk tlačítka a odešle se formulář) takto: document.getElementById(„btn“).click();
Otázka zní: Zavolá se mezitím i kód zobrazující alert nebo ne? Zkuste si schválně tipnout než budete číst dál.
Ještě do včera bych s odpovědí neváhal a nevěřil, že to může být jinak. Až dnes. Správná odpověď je, že se handler onclick události i v tomto případě skutečně zavolá. V minulosti jsem se párkrát dostal do situace, kdy by se mi zmíněný model hodil v případě, že by se onclick handler skutečně vyvolal, ale protože jsem byl přesvědčený, že to nemůže fungovat, vždy jsem hledal jiné, třeba složitější řešení.
Pokud přemýšlíte, proč jsem se choval tak hloupě, pak proto, že jsem si kdysi v učebnici JavaScriptu přečetl (a nebyla to žádná jiná než slavný David Flanagan: JavaScript – kompletní průvodce):
Metoda click() elementu formuláře simuluje klepnutí myši na tento element formuláře, přičemž ale nevyvolá ovladač události onclick daného elementu. Metoda click() nemá příliš časté uplatnění.
A jak by také mohla mít časté uplatnění, když onen ovladač události nespustí, to pak je vcelku na nic. A tak jsem si zapamatoval, že metodu click() mám ignorovat a úspěšně jsem ji ignoroval až doteď. Vůbec mě nenapadlo, že to dobrák Flanagan má napsané špatně.
Poučení zní nikdy nevěřte učebnicím, ať už je psal kdokoliv. Divím se, že problém nikdo nehlásil. Přeci jen už uplynula řádka let od prvního vydání Flanaganovy knihy do jejího posledního vydání v roce 2006, ve kterém chyba i nadále je. Nu což, sepisuji Flanaganovi bugreport.
Pro zkoumání jsem si udělal malý testcase a opět jsem si při tom nemohl nevšimnout že:
to 1: Mozna by sis ten zapisek mel precist jeste jednou a pomaleji, pripadne se zamerit na citovanou vetu "Metoda click() elementu formuláře simuluje klepnutí myši na tento element formuláře, přičemž ale nevyvolá ovladač události onclick daného elementu." Treba ti pak dojde, ze je trochu o necem jinem.
Zrovna s tim clickem byl v acid3 problem, muselo se to predelavat (a diky tomu WebKitu opet naskocil dalsi bodik), viz http://webkit.org/blog/161/webkit-hits-93100-in-acid3/
I kdyz se priznam, ze po precteni tveho spotu uz v tom mam fakt gulas. Puvodne jsem to pochopil tak, ze click() skutecne neni mozny volat rekurzivne, ale ze Acid3 si myslel ze jo, a pak Hixieho upozornili na to, ze to zadny prohlizec nepovoluje (protoze povoleni takovyhle rekurze vede k problemum na strankach), tak Acid upravili.
[3] Ano, právě při zkoumání případu Acid3 vs. WebKit jsem na svůj letitý omyl přišel 8-)
V Acid3 byla situace o něco složitější. Ono právě proto, že .click() ve výsledku vyvolá i handler onlick je teoreticky možné, aby onen handler zavolal další .click() a celé se to nakonec zacyklilo.
Tohle chování nikdo nespecifikuje (tedy ani nezakazuje), ovšem prohlížeče (nejen WebKit, ale i další) si na to už aplikovali svá omezení. Což bylo logické, jelikož to nikdo reálně nevyužíval a když už, se takový kód někde objevil, bylo to omylem a způsoboval zacyklení a zatuhnutí prohlížeče.
Acid3 tak vynucoval něco, co je sice nejspíš v pořádku, ale není to přesně definované, nikdo to nepoužívá a úprava prohlížečů by způsobila nefunkčnost některých stávajících stránek, případně i zamrznutí prohlížeče na nich.
Výsledek: Obě strany se dohodli, že bude lepší, pokud na tom dnes Acid 3 trvat nebude. Ve specifikaci HTML5 se pokusí tenhle problém jednou pro vždy objasnit a následně se to dostane pravděpodobně do některého z dalších Acid testů.
Ja nevim, cemu se divis. Ucebnice ci jakoukoliv jinou odbornou ci neodbornou literaturu pisou jenom lide, takoveto chyby se tam proste zakonite musi vyskytovat a vyskytuji... Zvlast kdyz je to natolik odvijejici odvetvi a je to silne neexaktni zalezitost (resp. zavisla na konkretni implementaci v tom ci onom prohlizeci).
[5] Ale mě opravdu překvapilo, že v knize, kterou četli už možná i statisíce lidí po celém světě, může i po řadu let vydržet celkem důležitá chyba. Nejde mi o autora, který se může zmýlit, ale v referenčních příručkách, které prošly davem rukou, nebývají zásadních problémy. Docela by mne zajímalo, jak velká část toho davu si to dodnes myslí špatně tak jako já.
Jen pro uplnost, byla ta chyba v originale, nebo v prekladu? Osobne jsem nikdy zadnou takovouhle knihu necet ale vzdy si nekde najdu jen help od konkretni veci, kterou si nejsem jistej, pripadne ji vyzkousim, takze nejsem typickej ctenar, ale vim, ze obcas bejvaji preklady podivne....
Mna to neprekvapilo. Kedze vsetky eventy sa vykonavaju prednostne a az potom sa vykonava udalost daneho tagu, pokial ich samozrejme v danom evente nevypnete. Nikdy som ziadnu knihu necital. Radsej sa ucim na hotovych prikladoch. Teoriu dotiahnem az dodatocne. Sam presadzujem podobny styl vyucby. Nikoho netrapi sucha teoria pokial z nej nepochopi naco to je dobre.
[12] Ako nie ? Kazda javascriptova udalost (ako tu spominany onclick) je vzdy vykonavana pred udalostou definovanou v tagu. Opacne si to predstavit neviem, ci snad pred clickom by sa mal vykonavat submit ? Preco by potom bola normou tato udalost povolena ? Ja teda neviem, ale nepotrebujem zistovat v knizkach dodatocne nieco co je dane v norme.
Na začátek studia jakékoliv problematiky jsou dobré knihy... můžete se poměrně rychle zorientovat, případně se dostat na určitou úroveň znalostí... pak s přibývajícíma znalostma většinou pozorujete nejen to, že v knihách jsou občas, pro vás již dosti podstatná, zjednodušení. Dokonce tam mohou být chyby, a ani to, že knihu napsala nějaká osobnost vám nezaručí že ne ( jsme jen lidé, a mimo to každý můžeme jednu věc chápat ne různých úrovních, různým způsobem ).
Každá kniha klade důraz na část problematiky a je jasné že se v ostatních oblastech budou vyskytovat zjednodušení. Ať již prostě z důvodu, že rozsah knihy nedovolí se tím zabívat, nebo i proto, že autor té problematice není "pečený vařený", což v žádném případě nemusí ubírat celkovému přínosu knihy.
Od jisté úrovně(nejlépe však od začátku) je dobré každou novou vědomost ověřovat, polemizovat s autorem, jestli to je opravdu tak jak mi tvrdí, že to co mi pověděl má zajímavé důsledky a ty si nejlépe testovat... To je jeden z velmi produktivních způsobů zvyšování úrovně znalostí a dovolí vám to z knihy vydobít více vědomostí než kolik jich obsahuje ;)
Chápu, že to že kniha obsahuje chyby ve vás může způsobit dočasně nedůvěru... je však na vás jak se s tou nedůvěrou vyrovnáte. Prostě chyby jsou faktem a vy se s tím musíte vypořádat, buď knihy zahodíte jako studnu vědomostí, ale to by jste pak musel udělat z každým zdrojem, který si přímo neověřujete (rozmluva s kolegou/šéfem, článek na internetu, v novinách, pořad v televizi, protože tam se vyskytují také chyby), nebo přistoupíte k jinému způsobu využívání zdrojů.
Já se s tím vypořádávám tak že se snažím co nejvíce věcí "testovat". Je to sice, hlavně z počátku náročné (musíte tříbit na to co je nová vědomost a co již vím(je pro mne pravdou), musíte vymýšlet jak něco ověřit atd.) ale po chvíli si všimnete, že to jde již "samo"... Samozřejmě tento způsob nepoužívám na všechny informace, ale pouze na část(na tu oblast ve které chci být erudovaný :))... jinak beru v potaz fakt, že to co jsem se dozvěděl "klasickým" způsobem jsou jenom doměnky a nikoliv pravda, která je nepopiratelná.
Sorry za dlouhý příspěvek :)
[16] tonk>
A můžete nám prozradit jak víte, že jsou správné když si to sám neověřujete? ... máte člověka co vám řekl: Je to tam správně. Nebo více lidí říká: Je to tam správně. ?
Výborný komentář jestli jste nečetl:
http://flasher.blog.root.cz/0803/chce-li-flamer-linux-bit-hul-si-vzdycky-najde#komentar-11604
Komu by jste věřil? :)
Jedna věc je číst knihy které jsou správně... jiná je správně to pochopit... správně si zapamatovat... tam hodně pomáhá to ověřování ;)
Martin Hassman ex-biochemik, umělecký programátor a publicista. Spoluzakladatel CZilly, zakladatel Zdrojáku, správce HTML5.cz, organizátor hackathonů, čekovacích muzejních nocí aj. akcí.
Přečteno 23 503×
Přečteno 23 060×
Přečteno 20 191×
Přečteno 19 489×
Přečteno 19 232×