Jazyk JavaScript je přímo protkán věcmi které fungují v různých prohlížečích různě, bohužel mezi tyto věci patří často i věci velmi základní - jako třeba metoda zmíněná v titulku.
Notoricky známá metoda document.getElementById("nejake_id") vrací referenci na objekt reprezentující HTML element aktuálního dokumentu jehož id="nejake_id". V případě neexistence takového elementu vrací "null". Jednoduché a hlavně velmi užitečné. Bohužel ve světě IE je vše jinak. Neboť jak praví MSDN, zmíněná metoda v IE dělá toto:
Returns a reference to the first object with the specified value of the ID or NAME attribute.
Nemáte-li v dokumentu element s hodnotou atributu name stejnou jako je id elementu ke kterému chcete přistupovat, vše funguje jak má. V opačném případě máte problém a to velký. Funkce vám vrátí referenci na první objekt, jehož id nebo name odpovídá požadované hodnotě. Tzn. bude-li prvním odpovídajícím objektem v dokumentu objekt s hledanou hodnotou v parametru name, vrátí vám to jej, nikoliv ten s odpovídajícím id, který je až za ním.
Z toho plyne závěr, že v IE (v IE 8 se funkce již má chovat správně a standardně a fungovala mi jak má i v IE 7, ovšem nezkoumal jsem jestli se tak chová ve všech módech prohlížeče) neexistuje rozumná možnost jak jednoznačně a spolehlivě získat odkaz na element s určitým id. Musíte spoléhat na náhodu že se v dokumentu neobjeví žádný element s hodnotou parametru name stejnou jako je id nějakého elementu se kterým pracujete v JavaScriptu, nebo musíte procházet celý DOM strom a u každého elementu porovnávat hodnotu parametru id.
První možnost je nekoncepční a riskantní – spoléhat na náhodu by se programátor neměl nikdy – druhá zase velmi pomalá. Vzhledem k tomu jak často se tato funkce používá, zvolil jsem první cestu – často jeden skript potřebuje přistupovat třeba k desítkám různých elementů a kdyby se pro každý měl procházet strom dokumentu…
Závěrem podotknu že JavaScript bytostně nesnáším a cokoliv s ním dělám velmi nerad a při téměř každé interakci s ním se nejen ukáže, že tento můj názor je zcela opodstatněný, ale že realita je ještě horší než byly mé předchozí představy.
Publikováno 12.05.2008 20:51 v sekci Webdesign
Trvalý odkaz
Komentářů: 1 (Zobrazit komentáře)
Napsal Dash 09.09.2008 22:03:09
Tuhle chybu obcházím s úspěchem už pár let velice jednoduše - prvkům s NAME a ID dávám stejné NAME i ID a nikdy nepoužívám na jedné stránce kombinace jako INPUT s NAME=\"value\" a DIV s ID=\"value\". Takže jsem na tuhle chybu už skoro i zapomenul.