Hlavní navigace

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

1. 4. 2008 20:25 (aktualizováno) Martin Hassman

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

Sdílet