Încărcare asincronă javascript wordpress. Încărcare JS sincronă standard. Care este diferența dintre atributele async și defer

HTML este conceput astfel încât pagina web să fie încărcată secvenţial linie cu linie, încărcând pe rând toate elementele incluse în codul html. Și dacă unul dintre ele nu este disponibil (de exemplu, JavaScript nu este citit de pe un site extern), atunci încărcarea ulterioară a site-ului se oprește.

Când JS care nu poate fi citit este în partea de sus a paginii, este posibil ca vizitatorul să nu vadă nimic.

Prin urmare, atunci când utilizați JavaScript de pe site-uri terțe pe site-ul dvs., de exemplu pentru a afișa reclame, este foarte recomandabil să le încărcați asincron. În acest caz, JS terță parte nu va întârzia încărcarea și afișarea site-ului dvs.

Din păcate, nu toate retele de publicitate oferă posibilitatea de a încărca scripturi asincron. Prin urmare, în acest articol vă voi spune cum să schimbați codul de încărcare sincronă în asincron. Dacă proprietarul acestui script nu oferă această opțiune.

Încărcare JS sincronă standard

De obicei, apelarea scriptului cu server extern arata asa:

Încărcarea asincronă a scripturilor, așa cum o face Google/Adsense

Am primit ideea de la Google/Adsense. Pentru ca scriptul să se încarce asincron de restul codului HTML, trebuie să adăugați asincron la codul de apel.

Și acum, pentru ca codul să se încarce asincron, apelul nostru de script de la serverul extern ar trebui să arate astfel:

După cum puteți vedea, totul este simplu. Adevărat, acest lucru va funcționa numai în browserele care acceptă standardul HTML5. La momentul scrierii acestui articol, există o majoritate absolută de astfel de browsere.

Opțiunea propusă nu este 100% universală. Multe scripturi pur și simplu nu mai funcționează după efectuarea acestor modificări. Conform recenziilor de pe Internet, această metodă nu funcționează dacă elementul este utilizat în script document.scrie.

Opțiune fiabilă de încărcare asincronă

Dacă prima opțiune sugerată nu funcționează pentru dvs. Atunci profită următoarele recomandări. Aceasta este în esență încărcare leneșă. Deoarece apelul de script real are loc chiar la sfârșit Pagini HTML, adică atunci când tot conținutul necesar al paginii este deja pe ecran.

În locul din pagină în care doriți să afișați rezultatul Funcționează JavaScript trebuie să creați un bloc div gol:

Apoi, la sfârșitul paginii, înainte de eticheta BODY de închidere, inserăm un script pentru încărcare asincronă:

// JavaScript care trebuie încărcat asincron // mutați-l în poziție reală afișa document.getElementById("script_block_0").appendChild(document.getElementById("script_ad_0"));

// arată document.getElementById("script_ad_0").style.display = "blocare";

Dacă există mai multe blocuri de publicitate, atunci pentru fiecare dintre ele trebuie să repetați totul, creând blocuri DIV individuale unice. Nu uitați să schimbați numele claselor și ID-urile DIV. În exemplul meu, este suficient să schimbați numărul zero, în noul bloc trebuie înlocuit cu 1 și așa mai departe. Această opțiune este mai complexă, dar funcționează peste tot, cu excepția browserelor foarte vechi, cum ar fi Internet Explorer

6. Care, din fericire, practic nu se mai găsește pe computerele utilizatorilor. O modalitate de a accelera încărcarea paginilor web site-ului prin optimizarea fișierelor script Java și cod html

pagini. Javascript prezintă o provocare deosebită pentru resurse moderne . Ele sunt pur și simplu supraîncărcate cu ele și acest lucru duce laîncărcare lentă

și, în consecință, afișaj de proastă calitate. Dacă conexiunea la rețea este lentă, ceea ce este tipic pentru comunicatii mobile

și utilizatori la distanță, apoi încărcarea încetinește semnificativ, provocând iritații justificate.

Când browserul citește codul html, afișează rezultatul secvenţial. Aceste. fiecare linie urmează una pe alta, dar la locul în care este instalat javascript are loc o oprire - cei care folosesc acest limbaj pentru a scrie resurse s-au confruntat cu siguranță cu această problemă. Rezolvarea problemei -încărcare asincronă . Doar plasați javascript la sfârșitul codului html al paginii. Acest lucru va duce la faptul că încărcarea „java” va fi întârziată în timp, asigurând afișare corectă

pagini și un strat rapid pentru utilizatorii de resurse. Cele mai serioase resurse trec la încărcare asincronă, încercând să-și păstreze publicul și să introducă inovații utile.

Să ne uităm la mai multe moduri de a optimiza încărcarea javascript.

< script src= type= "text/javascript" >

Acest fișier javascript este încărcat după cum urmează:

< script async src= "//www.адрес_сайта/script.js" type= "text/javascript" >

< script defer src= "//www.адрес_сайта/script.js" type= "text/javascript" >

HTML5 s-a ocupat cu prudență de problema încărcării unei pagini cu „java”. Are capacitatea de a seta încărcarea asincronă a scriptului, ceea ce crește viteza de afișare a resursei în mod semnificativ. Pentru a face acest lucru, adăugați parametrii async sau defer la codul html, după cum se indică mai jos:

Care este diferența dintre atributele async și defer?

Ambele opțiuni funcționează cu încărcare javascript asincronă. Diferența constă în timpul de afișare și începutul execuției scriptului. Atributul asincron va rula scriptul imediat după sarcina completa

Când setați atributul defer în codul paginii, javascript va fi în coadă între alte scripturi fără a le perturba ordinea de execuție. Va începe să funcționeze numai după ce pagina este complet încărcată, dar va pierde evenimentul DOMContentLoaded (obiect document).

Cu toate acestea, aceste atribute nu funcționează în unele browsere moderne. De exemplu, Internet Explorer nu acceptă atributele async și defer. Și liniile document.write nu vor ajuta cu nimic în fișierele script.js

Script special de la Google pentru încărcarea javascript asincronă

Google a devenit lider în dezvoltarea tehnologiilor care permit paginilor site-ului web să se încarce în timp record. În plus, ratingul motor de căutare Google retrogradează site-urile cu performanțe slabe, așa că acordați atenție unui scârțâit special din partea webmasterilor Google, conceput pentru a încărca javascript asincron.

Pentru a aplica acest script, pur și simplu înlocuiți

pe

Apoi includem fișierul script extsrc.js

Obținem următorul cod:

< script src= "//extsrcjs.googlecode.com/svn/trunk/extsrc.js" > < script extsrc= "...." >

Din păcate, această metodă nu funcționează nici pentru fișierele cu document.write

Acest metoda va funcționa pentru toate browserele fără excepție și funcționează chiar și cu document.write

În codul html al paginii creăm un bloc div gol:

Și la sfârșitul codului html, înainte de , inserăm un script pentru încărcare asincronă:

Iată orice fișier sau script care trebuie încărcat.

// mutați-l în poziția actuală de afișare document.getElementById("script_block").appendChild(document.getElementById("script_ad")); // arată document.getElementById("script_ad").style.display = "bloch"; Vă rugăm să rețineți că în versiunile de IE mai mici de 6, inclusiv, această descărcare nu funcționează. Dar nu sunt sigur că astfel de utilizatori rămân - sunt o minoritate. Utilizarea altor browsere și servicii această optimizare pentru javascript ceea ce se reflectă

în cel mai bun mod posibil asupra vitezei de încărcare a resurselor. Acum o să vă povestesc despre

intr-un mod interesant

Este foarte simplu. Un site web modern este o colecție de o mare varietate de scripturi, etichete, fragmente, stiluri, fonturi și orice altceva. După cum înțelegeți, cu cât sunt mai multe „bunătăți”, cu atât este nevoie de mai mult timp pentru ca site-ul dvs. să se încarce. În ceea ce privește JavaScript, aceasta este o altă chestiune. Ați observat vreodată un astfel de bloc când pagina pare să se fi încărcat, dar fila arată că pagina încă se încarcă? Acest lucru se întâmplă atunci când un anumit script nu s-a încărcat până la sfârșit. Ar fi bine, uneori pagina este complet inactivă până când se încarcă același script, aparent nu foarte important. Și utilizatorii dvs. pur și simplu nu au suficientă răbdare.

Acest concept complet opus încărcării sincrone, care este un script obișnuit precum:

Un apel de script asincron arată astfel:

Acum scripturile nu vor obliga utilizatorii să aștepte încărcarea lor completă, totul se va întâmpla în paralel.

Cum să automatizez procesul?

Este clar că dacă conectați manual scripturile și nu sunt multe dintre ele, atunci puteți face acest lucru manual, pur și simplu adăugând atributul corespunzător la codul de apel. Dar cum poți automatiza asta dacă, de exemplu, ai WordPress cu o grămadă de scripturi care, în plus, sunt numite automat?

Găsiți fișierul functions.php deja familiar al temei și introduceți următorul cod acolo (de exemplu, la sfârșit):

// funcția javascript asincronă wcs_defer_javascripts ($url) ( if (FALSE === strpos($url, ".js")) return $url; if (strpos($url, "jquery.js")) return $url; return "$url" async="async" ) add_filter("clean_url", "wcs_defer_javascripts", 11, 1);

Concluzie

Ce pot sa adaug in concluzie? Este posibil ca acest script să nu fie potrivit pentru toată lumea, pentru că cine știe ce scripturi ai conectat, așa că instalează-l și experimentează. Nu poate exista niciun dezavantaj la un astfel de script, cu excepția poate incompatibilității cu un anumit site din cauza specificului său. Acesta a fost un alt pas mic spre optimizarea mare a site-ului dvs.

Odată cu creșterea vitezei de conectare la Internet și creșterea puterii nu numai a desktop-ului, ci și dispozitive mobile Paginile web devin din ce în ce mai grele. Numărul și dimensiunea fișierelor conectate este în creștere: fișiere JavaScript, fișiere css, imagini, widget-uri pentru site-uri terță parte, iframe. Pe în acest moment Specificul modului în care funcționează browserele este astfel încât la încărcarea unui fișier js, redarea este blocată până când scriptul este executat. Browsere moderne V fundal va analiza documentul și va descărca scripturi și stiluri, dar randarea va fi blocată. Comparaţie parametrii rețelei Pentru browsere diferite poate fi vizualizat la browserscope.org. Nu putem elimina complet blocarea, dar putem optimiza părțile server și client ale aplicației, astfel încât blocarea randării să dureze cel mai scurt timp.

Soluții pe partea serverului:
- Reduceți dimensiunea fișierelor transferate
- Utilizați CDN
- Mutați fișierele statice într-un domeniu sau subdomeniu separat, crescând astfel numărul de conexiuni simultane de browser.
- Activați compresia fișierelor transferate (gzip)

Soluții pentru partea clientului:
- Reducerea numărului de solicitări.
- Fișierele cache pe partea clientului folosind anteturile Expires și Etags.
- Utilizați CDN-uri disponibile public (Google CDN, Yandex CDN). Deci, există posibilitatea ca fișierul din CDN-ul public să fie deja stocat în memoria cache a browserului.

O modalitate de a optimiza viteza de încărcare a site-ului este să încărcați fișierele în mod asincron, ceea ce nu blochează redarea.

Script de încărcare asincronă JavaScript:

(function() ( var s = document.createElement("script"); s.type = "text/javascript"; s.async = true; s.src = "Adresa URL a fișierului"; document.getElementsByTagName("head") .appendChild(script);

Dacă JavaScript trebuie să fie executat după ce întreaga pagină a fost încărcată, inclusiv conținut, imagini, fișiere de stil și scripturi externe, atunci evenimentul onload trebuie adăugat la încărcător.

Dacă (window.addEventListener) ( window.addEventListener(„încărcare”, încărcare_async, false); ) else if (window.attachEvent) ( window.attachEvent(„încărcare”, încărcare_async); )

Scriptul JavaScript de încărcare asincronă ținând cont de evenimentul onload (function() ( function async_load())( var s = document.createElement("script"); s.type = "text/javascript"; s.async = true; s .src = „Adresa URL a fișierului”; document.getElementsByTagName(„head”).appendChild(script); if (window.addEventListener) ( window.addEventListener(„load”, async_load, false); ) else if (window.attachEvent) ( fereastra .attachEvent("onload", async_load); ) ))();

Dar acesta este un caz izolat când este necesară descărcarea unui singur fișier. Adesea, în practică, multe fișiere sunt conectate.

Script pentru încărcarea asincronă a mai multor conectori Fișiere JavaScript(function() ( function async_load())( [ "URL_1.js", "URL_2.js", "URL_3.js" ].forEach(function(src) ( var s = document.createElement("script"); s .type = "text/javascript"; s.async = true; document.getElementsByTagName("head").appendChild(script); attachEvent("onload", async_load ) ))();

Dar există un minus în această implementare - scripturile vor fi încărcate în ordine aleatorie și, în consecință, vor fi executate aleatoriu în timp. Acest script de încărcare asincronă este ideal dacă Execuție JavaScript fișierele nu depind unul de celălalt și nu depind de DOM. În caz contrar, utilizarea acestuia poate duce la erori în pagină sau la rezultate neașteptate ale execuției. Pentru executie secventiala, dar descărcare asincronă, trebuie să specificați async=false, apoi fișierele vor fi descărcate în ordine aleatorie, dar executate unul câte unul.

HTML 5. Încărcare JavaScript asincron

Standardul HTML 5 acceptă încărcarea asincronă a JavaScript. Acest lucru se poate face prin adăugare cuvânt cheie asincron sau amânare. De exemplu:

Un script care este conectat cu atributul defer va fi executat fără a perturba ordinea de execuție în raport cu alte scripturi și execuția sa va avea loc după ce pagina este complet încărcată și analizată, dar înainte ca DOMContentLoaded să fie apelat.

Un script care este conectat cu atributul asincron va fi executat cât mai curând posibil după ce a fost încărcat complet, dar nu așteaptă ca analizarea documentului să se termine și înainte ca obiectul fereastră să fie încărcat. Browserele nu garantează că scripturile vor fi executate în aceeași ordine în care sunt conectate.

Biblioteci pentru încărcare asincronă JavaScript

RequireJS este un modul de încărcare JavaScript. Optimizat pentru browsere, dar poate fi folosit în alte medii precum Node, Rhino.

Require(["script"], function(script) ( console.log ("pornire dupa incarcarea script.js"); ));

extsrc.js este o bibliotecă care rulează scripturi care urmează să fie executate după ce pagina este încărcată și afișată utilizatorului. Funcționează corect cu document.write.

yepnope.js - permite încărcarea asincronă a fișierelor JavaScript și CSS.

Yepnope([ "script.js", "style.css" ]);

O modalitate ușoară de a încărca scripturi JavaScript

Se dovedește că, în practică, realizarea unei încărcări optime între browsere a scripturilor JavaScript care nu blochează afișarea este dificilă și uneori imposibilă. Cele mai multe mod optim este adăugat la sfârșitul documentului înainte de închidere eticheta corporală. Din cauza restricțiilor browsere diferiteși HTML în sine, o astfel de opțiune de încărcare care nu blochează afișarea poate fi considerată cea mai simplă.

Notă: mai jos este o traducere a unui articol de la Steve Souders (autor al celebrelor sfaturi Yahoo! privind performanța clienților) „Coupling async scripts”. Steve analizează comportamentul de încărcare al fișierelor JavaScript și sugerează mai multe modalități de a ocoli proprietățile lor de blocare. Comentariile mele de mai jos sunt cu caractere cursive.

Cea mai mare parte a muncii mele este în în ultima vreme a fost dedicat încărcării asincrone a scripturilor externe. Dacă scripturile sunt încărcate în ordinea normală (), atunci ele blochează încărcarea tuturor celorlalte componente ale paginii ( V ultimele versiuni Acesta nu este cazul în Firefox și Safari, dar despre care vorbim, practic, aproximativ 70% dintre utilizatorii cu IE) și blocați redarea întregii părți a paginii care se află sub apelul la scripturi în codul HTML. Acest lucru poate fi văzut pe pagina de test, plasăm scripturile mai jos de exemplu, folosind creație dinamică obiecte după ce fereastra de eveniment combinată.onload este declanșată) previne acest comportament al browserului, care accelerează încărcarea paginii.

Singura problemă cu încărcarea asincronă a scripturilor este interacțiunea lor cu internă ( în linie) scripturi de pagină ( precum și cu alte scripturi externe), care folosesc variabile definite într-un script extern. Dacă un script extern este încărcat asincron fără nicio cunoaștere a codului intern al paginii HTML, atunci este foarte posibil ca ( și va apărea în majoritatea cazurilor) când unele variabile nu vor fi definite la momentul utilizării lor. Prin urmare, este necesar să ne asigurăm că scripturile externe încărcate asincron și scripturile de pagină interne sunt cuplate: scripturile interne nu sunt executate până când scripturi asincrone nu se va încărca complet.

Sunt mai multe ( standard) modalități de a conecta scripturi încărcate asincron cu alt cod JavaScript:

  • fereastra la încărcare. Execuția codului JavaScript intern poate fi legată de evenimentul de încărcare a ferestrei. Este foarte ușor de utilizat, dar unele dintre scripturi pot fi executate mai devreme.
  • onreadystatechange în script. Codul intern poate fi legat de evenimentele onreadystatechange și/sau onload. (Va fi necesar să folosiți ambele opțiuni pentru a acoperi totul browsere populare.) În acest caz va fi mai mult cod, va fi mai complex, dar va exista garanția că va fi executat imediat după încărcarea fișierelor externe corespunzătoare.
  • Apeluri încorporate. Scripturile externe pot fi modificate pentru a include un apel la sfârșit zonă mică codul care va apela funcția corespunzătoare din cod intern. Toate acestea sunt grozave dacă scripturile externe și interne sunt dezvoltate de aceeași echipă. Dar, în cazul utilizării dezvoltărilor de la terți, acest lucru nu va oferi toată flexibilitatea necesară pentru conectarea scripturilor externe cu codul intern.

În acest articol, acopăr simultan (fără joc de cuvinte!) două probleme: cum scripturile asincrone accelerează încărcarea paginii și cum poți combina scripturile asincrone și cele interne folosind o versiune modificată a încărcării de la John Resig ( de jQuery) este un șablon de etichetă cu script dublu. O ilustrare a acestui lucru este munca mea recentă de sortare a rezultatelor UA Profiler. Am făcut-o folosind scriptul de sortare de la Stuart Langridge. În aproximativ 5 minute am reușit să adaug scriptul lui pe o pagină pentru a sorta tabelul cu rezultate. Cu puțin mai mult timp, am reușit să fac acest script să se încarce asincron și să accelerez încărcarea paginii cu peste 30% folosind tehnica de andocare a scriptului asincron.

Apeluri regulate de script

Am adăugat inițial scriptul de sortare al lui Stuart Langridge la pagina UA Profiler în mod obișnuit(prin ), acest lucru poate fi văzut în varianta cu un apel obișnuit de script. Diagrama de încărcare este prezentată în Fig. 1.

Orez. 1. Diagrama de încărcare a scripturilor în cazul obișnuit.

Deși sortarea datelor din tabel a funcționat, nu m-a făcut mai fericit deoarece încărcarea paginii a încetinit. În fig. 1 arată clar cum versiunea mea a scriptului (numit sorttable-async.js) blochează toate celelalte solicitări HTTP de pe pagină (în special, arrow-right-20x9.gif), ceea ce încetinește încărcarea paginii. Toate diagramele de încărcare au fost preluate folosind Firebug 1.3 beta. În această versiune de Firebug, linia roșie afișează evenimentul onload. (Și linia albastră corespunde evenimentului domcontentloaded.) Pentru versiunea cu un apel obișnuit de script, evenimentul onload se declanșează la 487 milisecunde.

Scriptul sorttable-async.js nu este necesar pentru a reda inițial pagina: coloanele pot fi sortate numai după ce coloanele în sine au fost randate. Această situație (scripturi externe care nu sunt folosite pentru a reda inițial pagina) este candidatul numărul 1 pentru implementarea încărcării asincrone. Opțiunea de încărcare a scriptului asincron conectează acest script folosind metode DOM pentru a crea o nouă etichetă de script:

var script = document.createElement("script"); script.src = "sorttable-async.js"; script.text = "sorttable.init()"; // acest lucru este explicat în secțiunea următoare document.getElementsByTagName("head").appendChild(script);

Diagrama de încărcare HTTP pentru încărcarea asincronă a scripturilor este prezentată în Fig. 2. Merită remarcat modul în care abordarea asincronă previne comportamentul de blocare: sorttable-async.js și arrow-right-20x9.gif sunt încărcate în paralel. Aceasta reduce timpul total timpul de încărcare este de 429 ms.

Orez. 2. Diagrama de încărcare a scripturilor în cazul asincron

Șablon de script dublu de John Resig

Vă permite să accelerați încărcarea paginii, dar în acest caz mai este loc de îmbunătățire. În mod implicit, un script de sortare se autoinvocă atașând sorttable.init() la handlerul de evenimente onload al scriptului. Unele îmbunătățiri ale performanței ( și reducerea codului) poate fi realizat apelând sorttable.init() în interiorul unei etichete de script pentru a-l apela imediat după ce scriptul extern este încărcat ( conectat prin src). În acest caz, folosesc o singură funcție ca „API”, dar cred că acest caz ilustrează un model extensibil maxim care vă permite să utilizați modul extern fără presupuneri cu privire la utilizarea sa ulterioară ( situație clasică de utilizare a logicii JavaScript de la dezvoltatori externi).

Am descris deja trei metode pentru conectarea codului intern cu încărcarea asincronă a scripturilor externe: onload window, onreadystatechange pentru script și un handler încorporat în script. În schimb, am folosit o tehnică de la John Resig - modelul de etichetă cu script dublu. John descrie cum să legați scripturile interne la încărcare fișier extern după cum urmează:

jQuery(„p”).addClass(„frumos”);

În acest caz, codul din interior se declanșează numai după încărcare ( și inițializare) scriptul extern sa încheiat. Această abordare de conectare a scripturilor are câteva avantaje evidente:

  • mai simplu: o etichetă de script în loc de două
  • mai transparent: legătura dintre codul intern și cel extern este mai evidentă
  • mai sigur: dacă scriptul extern nu se încarcă, codul intern nu va fi executat, ceea ce va împiedica apariția erorilor legate de variabilele nedefinite

Acesta este un model excelent pentru încărcarea asincronă a scripturilor externe. Cu toate acestea, pentru a-l folosi va trebui să facem modificări atât codului intern, cât și fișierului extern. Pentru codul intern, a trebuit să adaug a treia linie deja menționată mai sus, care expune proprietatea script.text. Pentru a finaliza procesul de andocare, trebuie să adăugați sorttable-async.js la sfârșit:

var scripts = document.getElementsByTagName("script"); var cntr = scripts.length; while (cntr) ( var curScript = scripturi; if (-1 != curScript.src.indexOf("sorttable-async.js")) ( eval(curScript.innerHTML); break; ) cntr--; )

Acest cod parcurge toate scripturile de pe pagină, găsește blocul necesar, care ar trebui să se încarce singur (în acest caz este un script cu un src care conține sorttable-async.js). Apoi execută codul care este adăugat la script (în acest caz sorttable.init()) și astfel se autoinvocă. (Notă mică: deși la încărcarea scriptului, textul din acesta a fost adăugat folosind proprietățile textului, este accesat folosind proprietatea innerHTML. Acest lucru este necesar pentru a asigura compatibilitatea între browsere.) Utilizând această optimizare, putem încărca un fișier script extern fără a bloca încărcarea altor resurse și îl putem executa pe cel legat de acest scenariu cod intern.

De asemenea, merită remarcat faptul că tehnica descrisă poate fi doar un înlocuitor pentru modificarea directă a unui script extern. Dacă o astfel de modificare nu este posibilă, putem folosi doar instalarea unei verificări a sarcinii la un interval:

var _on_ready_execution = setInterval(function() ( if (typeof urchinTracker === function) ( urchinTracker(); clearInterval(_on_ready_execution); ) ), 10);

Această abordare a fost deja descrisă în cartea „Overclockează-ți site-ul web”, totuși, implică încărcare suplimentară pe procesor pentru verificare constantă scriptul necesar este gata și nu funcționează dacă fișierul extern nu este disponibil: verificarea continuă să ruleze.

Totuși, în cazul verificării pe interval, nu este nevoie să modificăm deloc fișierul extern, ci în caz dublă utilizare eticheta de script este absolut necesară. Verificarea intervalului poate fi îmbunătățită dacă, după ce a trecut ceva timp (5-10 secunde, de exemplu), reporniți descărcarea fișierului extern (schimbând eticheta de script originală folosind un parametru unic GET) și, după mai multe reporniri nereușite, opriți descărcarea completă (poate cu unele, apoi un mesaj de eroare).

Încărcare leneșă

Timpul total de încărcare poate fi redus și mai mult prin încărcarea leneșă a scriptului (încărcarea lui dinamică ca parte a handler-ului de evenimente onload). Un exemplu al acestui comportament se află pe pagina cu