Internet Info, s.r.o. Lupa Root Měšec Podnikatel DigiZone Slunečnice Vitalianew Bomba Navrcholu Weblogy Jagg Woko Dobrý web Computer.cz SK: MojeLinky
Root.czBlogyMartin Hassman: nejen o prohlížečích

Už učebnicím nevěřím

Martin Hassman, 23. 03. 2008, 01:13 v kategorii WWW,

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.

A jak zní odpověď?

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ě.

A jaké je poučení?

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:

  • webové prohlížeče se nechovají ve všech případech stejně (srovnejte testcase ve Firefoxu a jakémkoliv jiném pohlížeči)
  • staré webové specifikace jsou stručné a nejasné - "simulate a mouse-click" zní hezky, ale vyloží si to každý, že se při tom ten handler skutečně má zavolat?
  • webové specifikace jsou nekonzistentní, kde je to jen možné: když metoda click() na tlačítku vyvolá handler onclick, jak dopadne metoda submit() na formuláři? Vyvolá onsubmit? Chyba lávky, nevyvolá! A co třeba reset() na formuláři, vyvolá onreset? To byste neuhodli, pro změnu zas vyvolá! A myslíte, že tohle je v HTML nebo DOM skutečně specifikováno? (Kdo odpoví ano, ale teprve až v chystaném HTML5, ten má pravdu.)

Komentáře (17)

  1. 23. 03. 2008, 02:21 dvh napsal:

    nechapem co ti nie je jasne:

    <bla bla bla onclick="alert('udalost')" bla bla bla>

    proste moje oko vidi v onclick=alert('udalost') tak je jasne ze ked na to kliknem tak to vypise "udalost"

  2. 23. 03. 2008, 08:45 Karel napsal:

    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.

  3. 23. 03. 2008, 10:25 Cynebeald napsal:

    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.

  4. 23. 03. 2008, 11:06 Martin Hassman napsal:

    [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ů.

  5. 24. 03. 2008, 16:12 erg napsal:

    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).

  6. 24. 03. 2008, 18:20 Martin Hassman napsal:

    [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á.

  7. 24. 03. 2008, 21:06 Jindra napsal:

    Rejpnuti: a uz jste to autorovi knihy napsal, aby to mohl opravit?

  8. 24. 03. 2008, 21:27 Martin Hassman napsal:

    [7] Odrejpnutí: A už jste si přečetl text, na který reagujete?

  9. 25. 03. 2008, 08:36 Miska napsal:

    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....

  10. 25. 03. 2008, 09:07 Uzivatel napsal:

    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.

  11. 25. 03. 2008, 12:47 Martin Hassman napsal:

    [9] V originále, v překladu a jak se tak dívám, tak i na dalších místech na webu. Asi to je už pěkně zažitá fáma.

  12. 25. 03. 2008, 12:49 Martin Hassman napsal:

    [10] Všechny právě ne, viz třeba ten submit.

  13. 25. 03. 2008, 16:58 Uzivatel napsal:

    [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.

  14. 25. 03. 2008, 17:10 Martin Hassman napsal:

    [13] A cetl jsi to poradne? Cela tahle diskuse je o simulovani udalosti JavaScriptem, nikoliv o jejich klasickem prubehu s interakci uzivatele.

  15. 26. 03. 2008, 07:14 tomfi napsal:

    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. 26. 03. 2008, 09:47 tonk napsal:

    ja uz se spoleham jen na encyklopedie na internetu nebo na opravdu odborne ucebnice u kterych vim ze jsou spravne, tak eliminuji chyby ;)

  17. 27. 03. 2008, 20:18 tomfi napsal:

    [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í ;)

K tomuto spotu není povoleno přidávání komentářů.