ugrás a tartalomhoz

Kód futtatása az összes oldalelem letöltődése előtt

Hojtsy Gábor · 2005. Szep. 26. (H), 07.53
Sokan szembesültek már azzal a problémával, hogy a window.onload eseménykezelő segítségével lefuttatott kódjuk túl későn kapott lehetőséget a beavatkozása, és így valamilyen dinamikus elem csak akkor tudott elindulni az oldalon, amikor már minden letöltődött. Ha korábban lefutó kódot szeretnénk, és már a weblap objektum modelljének feldolgozása is elegendő számunkra, akkor Mozilla böngészőkben az DOMContentLoaded esemény van segítségünkre, de mit tehetünk Internet Explorerben?

Nos, Dean Edwards ismerteti blogjában a megoldást, amit érdemes lépésenként feldolgozni. Először is a <script> elemeken használható defer tulajdonság támogatását használja ki, ami pont a DOM objektumok összeállítása utáni betöltésre és végrehajtásra készteti a böngészőt. Ennek működésre bírásához, és más böngészőktől való elrejtéséhez azonban kisebb trükkökhöz kell folyamodni, amelyekhez vagy a feltételes megjegyzéseket vagy a feltételes JavaScript kód végrehajtást tudjuk segítségül hívni. Végül a többi böngésző számára Dean nem készített elő megoldást, így azoknak a szokásos onload eseménykezelő beállítást adjuk, amelynél azért figyelni kell, hogy a már kezelt böngészők esetén ne fusson le kétszer.

Így a teljes JavaScript kód az online kipróbálható demóból magyarra fordítva a következőképpen fest:

 <script type="text/javascript">
   function init() {
       // Ha már meghívták, ne fusson le újra
       if (arguments.callee.done) return;

       // Most hívják először, jelezzük, hogy ez megtörtént
       arguments.callee.done = true;

       // Itt lenne az onload esemény kódja
   };

   // Ez csak Mozilla böngészőkben megy
   if (document.addEventListener) {
       document.addEventListener("DOMContentLoaded", init, null);
   }

   // Ezt csak az Internet explorer fogja feldolgozni,
   // figyeljük meg, hogy a megjegyzések meddig tartanak!
   /*@cc_on @*/
   /*@if (@_win32)
       document.write("<script defer src=ie_onload.js><"+"/script>");
   /*@end @*/

   // A többi böngészőnek (az újrahívás védelemmel kerüljük el,
   // hogy Mozilla és Internet Explorer esetén is még egyszer lefusson)
   window.onload = init;
  </script>
 
1

progressbar

Anonymous · 2005. Szep. 27. (K), 09.47
Ha ilyet tudnak a böngészők, akkor lehet valahogy mérni, hogy a DOMContentLoaded-tól az onload-ig mennyi a vátható töltési idő? Magyarán létezik olyan furmányos trükk, rejtett cross-browser kód, amivel progressbart lehet készíteni?

Gyanítom, hogy nem, mert tudnia kéne mennyi byte töltődött be és mennyinek kell még betöltődnie. Mondjuk az még odagenerélható, hogy mennyi az összméret,aminek be kell töltődnie, de a mennyi van most és menniy van hátra az mérhető-e js-ből?

De megkérdeztem, mert eddig azt is gyanítani véltem, hogy az onload előtt nem nagyon lehet semmise :)
2

gányolni lehet

Hojtsy Gábor · 2005. Szep. 27. (K), 22.55
Hát a képeket JS objektumként be lehet tölteni, stb, és így lehet a betöltődést figyelni, de szerintem nem érdemes.