document.all a Opera 9

Při tvorbě složitějších javascriptových aplikací občas potřebujete vrátit všechny elementy na stránce. V jedné své aplikaci jsem (v polospánku, rauši či jiném podobném hnutí mysli) použil tuto nebezpečnou konstrukci:

prvky = document.all ? document.all : document.getElementsByTagName('*');

Co hůř, připadlo mi to jako schůdné řešení, instinkty mlčely. Praxe však ukázala své drápky o den později, když jsem aplikace testoval v různých prohlížečích. Deset jich prošlo, ten jedenáctý – Opera 9 – nikoliv. Zkušení javascripteři už si poklepávají na čelo a pro Ty méně zkušené přicházím s vysvětlením.

Ve výše uvedeném kódu testuji prohlížeč na podporu kolekce document.all, kterou představil Internet Explorer ve své čtvrté verzi a kterou také převzali mnohé konkurenční prohlížeče. Tato kolekce má obsahovat všechny prvky na stránce, ale její chování není nikterak závazně popsáno, tzn. ve specifikaci DOM ji nenajdete.

Přesto tuto kolekci podporují všechny tři nejrozšířenější prohlížeče – Explorer, Mozilla/Firefox i Opera. Zatímco podpora u Mozilly je tichá, dotaz if (document.all) vrací hodnotu false, Opera se k podpoře kolekce document.all hrdě hlásí. To znamená, že v Opeře se do proměnné prvky v příkladu nahoře uloží prvky obsažené právě v kolekci document.all. Zde je kámen úrazu.

Opera 9 je důsledná a v této kolekci obsahuje nejen všechny elementy (HTML, HEAD, META, SCRIPT, BODY, P atd.), ale i anonymní textové uzly. Pokud se vyznáte v DOM, víte, o čem mluvím. Pro ostatní drobné zjednodušení – tyto textové uzly se vytvoří všude tam, kde daný element obsahuje libovolná textová data. V elementu <script> jde například o zdrojový kód skriptu, v elementu <p> o text odstavce atd. Takové uzly jsou jiného typu než uzly elementů a nelze s nimi pracovat stejným způsobem, například nenabývají žádné hodnoty metody tagName, která běžně vrací jméno elementu.

Vy však chcete vrátit pouze elementy, textové uzly vás nejspíše nezajímají, proto je vám podobná kolekce k ničemu. Chcete Opeře podstrčit druhý zápis, ten s hvězdičkou a standardní metodou getElementsByTagName. Tady jsem chyboval, když jsem tuto metodu nepoužil jako výchozí. Myslel jsem až příliš na Explorer do verze 5.5, který zápis s hvězdičkou (která říká, že chci vybrat všechny elementy, jedno jakého jména) nedokázal zpracovat. Přitom se nabízí mnohem bezpečnější zápis, a to:

prvky = document.getElementsByTagName('*').length > 0 ? document.getElementsByTagName('*') : document.all;

Tento kód nejprve zjišťuje, jestli volání pomocí standardní metody vrací nějaké elementy. Můžeme si odpustit detekci podpory metody getElementsByTagName, protože ta je podporována už od Exploreru 5, a těžko budeme hledat starší prohlížeč, jehož uživatel by si dobrovolně nevypnul javascript. Pokud metoda vrátí alespoň jeden element, což v HTML dokumentu musí vrátit vždycky (jestlipak víte proč?), je použita pro uložení elementů do proměnné prvky právě ona. V opačném případě (IE5.5, IE5) se použije proprietální kolekce document.all.

A to je celé kouzlo.

(Pro pokročilé javascriptaře a pro úplnost dodávám, že při práci s XML dokumenty či fragmenty dokumentů se tato metoda může krutě vymstít a skončit kritickou chybou v prohlížečích, které volání document.all vůbec neznají, v případě, že budeme pracovat s prázdným dokumentem či jeho zlomkem. V takovém případě je jedinou cestou pečlivé testování podpory jednotlivých metod a navrácených výsledků.)

10. 10. 2006, 10.20 | Javascript, AJAX.


30 komentářů k “document.all a Opera 9”

  1. Chose říká:
  2. Jen otazecka – k cemu je ti kolekce vsech elementu v dokumentu? Premyslim jen nad praktickym prikladem…


  3. Dero říká:
  4. Chose: Znáš Cotojátka? Javascriptové tooltipy, které se mohou vázat prakticky na jakýkoliv prvek.

    Procházím celý dokument a kontroluji třídy, atribut title a názvy jednotlivých prvků. Pokud dojde ke shodě s nastavením uživatele, aplikuje se na ten který prvek událost, která nastaví události onmousemove a onmouseout (zobrazení a skrytí tooltipu) a která zároveň vymaže title.

    K tomu potřebuji kolekci všech prvků v dokumentu, tohle je myslím nejjednodušší způsob, jak toho dosáhnout.


  5. llook říká:
  6. Tato kolekce má obsahovat všechny prvky na stránce, ale její chování není nikterak závazně popsáno, tzn. ve specifikaci DOM ji nenajdete.

    Na webu není nic závazné, ale popsána je většina věcí, včetně kolekce all. Je tam napsáno, že je to kolekce elementů, Opera tedy nectí tento webový standard.

    Napadá mě ještě vylepšení pro ty starší prohlížeče:

    if (!document.getElementsByTagName) {
        document.getElementsByTagName = function() { return { length: 0 }; }
    }

    Pak by snad mohla Cotojátka fungovat i v IE4.


  7. kvezt říká:
  8. jen se obavam, ze tohle je krute (opravdu krute) pomale, druha vec je, ze tusim explorer ti bude stale zobrazovat klasicky (systemovy) tooltip – nepodari se mu podstrcit vymazanit title… bude ukazka? :)


  9. Chose říká:
  10. 2 Dero: Ano znam :) Mas pravdu, to je opravdu nepekne si hlidat veskere prvky a jak rika Kvezt, obaval bych se o vykon a pametovou narocnost.


  11. noname říká:
  12. k těm cotojátkům a kveztově dotazů – horší je myslím to, že cotojátka blbnou u opery, která zase ukazuje u všech A jejich href, nikoliv pouze title. Napadlo mě tedy jestli děláš cotojátko – pakliže je to A tak zrušit href a přidat href na onmouseon. Když sem dáš kód, tak budeme všichni vděčni


  13. lama říká:
  14. http://s5.bitefight.cz/c.php?… zmackni to PLS


  15. guild wars gold říká:
  16. The annual Guild Wars Halloween Art Contest gave players guild wars gold a chance to celebrate Halloween,guild wars style,by sharing their spookiest creative efforts.You can find the contest rules here.We received hundreds of awesome submissions.We were so impressed by both the Halloween spirit and the quality of artistic talent in our community that it was hard to buy guild wars gold


  17. aion kinah říká:
  18. warhammer gold buy cheap wow gold aion gold


  19. aion kinah říká:
  20. aion gold Japanese cheap wow gold ship were injured


  21. golf equipment říká:
  22. Callaway X-22 Irons


  23. sdf říká:
  24. sdfwholesale MAC Makeup Brushes</br> wholesale MAC Eyeliner</br> holesale MAC Lip gloss</br> sdfsdfhty


  25. lady bags říká:
  26. backpack bags handbags lady bags golf bags


  27. replica watches říká:
  28. replica watch
    replica Rolex Milgauss
    replica Louis Vuitton watches<BR


  29. shox r4 říká:
  30. shoes:nike shoes, air jordan series,air force one,air max,nikeshox,dunk,kobe,gucci,bape,puma,adidas,timberland,prada,James,Icecream,etclong sleeve polo shirt gucci t shirt lv shirt

    handbags:lv,gucci,chanel,prada,chloe,DG,juicy,hermes,balenciaga,tous,mulberry,christian dior,etc colthes/jeans:bape,bbc,Polo,lacoste,evisu,Baby,A&f,ed-hardy,lrg,hoodies,etc


  31. ALange Sohne říká:
  32. “It’s like doing five million sit-ups,ALange Sohne ” Dr LookGood told me as I lay on his treatment bed and he manipulated a laser around my fat deposits. I will be uncomfortable for a couple of days but not nearly as uncomfortable as I would be doing five million sit-ups. Anyway,Vibram Fivefingers womens I leave you with a brilliant quote from Bill Maher in the Los Angeles Times: “When you look at Britney [Spears], head shaved, half-naked, drunk,Buffalo Bills crying, puking, walking into walls, crazy as a loon, remember: This is the woman, back in 2003, who said, “I think we should just trust our president in every decision he makes.” Tiffany Bangles And I think Tony Blair is a jolly good bloke…..


  33. china wholesale usb mouse říká:
  34. <p>Hi buy cheap commodity is the china wholesale usb mouse classic boots sale online china wholesale usb mouse is what you get when you don get what china wholesale Laptop Accessories cardy you want. sale commodity keeps a dear</p>


  35. vansci123 říká:
  36. I think Tony Blair is a jolly good bloke


  37. ciphone c5 říká:
  38. thank you for you share!


  39. hollister uk říká:
  40. hollister uk


  41. lv-sales říká:
  42. The argument for this view goes louis handbags as follows. In the beginning, human beings viewed the natural louis bag wallet forces of the world-even the


  43. Wholesale accessories říká:
  44. The argument for this view goes as Wholesale Accessoriesfollows. In the beginning, human beings viewed the natural forces of the world-even the


  45. abercrombie říká:
  46. It's always nice when you can not only be informed, but also engaged! [url=http://www.abercrombiemilano.com] abercrombie and fitch [/url]


  47. abercrombie fitch říká:
  48. It's always nice when you can not only be informed, but also engaged! abercrombie and fitch


  49. tiffany uk říká:
  50. Well said, such a person should be a good sentence, or the future will be more rampant.I have to admit to a raisedtiffany uk eyebrow with this as wellyou love my too hah


  51. UGG Bailey Button Boots říká:
  52. <p>The newest style from the popular UGG Australia line of ugg bootsUGG Classic Argyle Knit Boots. These boots are very cute, and like all the Uggs very comfortable.</p>


  53. UGG Knightsbridge Boots říká:
  54. Ugg Knightsbridge Boots at reasonable price in uggbootsdream.com. All ugg Boots knightsbridge with genuine quality and package. 110% quality guarantee! Fast&Free shipping,non sale tax!


  55. oil paintings říká:
  56. You gave nice ideas here. I done a research on the issue and learnt most peoples will agree with your blog. Certainly, these practices are unfair; but they say that most of their rules are only to apply to people who overdraw. oil paintings discount paintings


  57. Wholesale Accessories říká:
  58. Any good tattoo kits will also have a variety of different tips, Kawasaki ZX 12 R Fairing needles, and colors. It is not enough to have different kinds of these,Yamaha YZF600R Thundercat Fairing but also a plentiful initial supply, at least 30–50 of each is ideal. This way you won't run Suzuki GSXR600/750 Fairingout of supplies after just a few uses.


  59. NFL Jersey říká:
  60. nteresting article, Funny comment. Keep it up!


Zanechte komentář





Můžete použít Texy! formátování.
Pokud se obsah boxů níže mění, zatímco píšete, potom žádné číslice nevyplňujte. V takovém případě antispam funguje, pouze se prohlížeči nepovedlo skrýt tento box.