TW Lab3
TW Lab3
Ingineria Sistemelor
RAPORT
despre lucrarea de
laborator nr.3
la Tehnologii Web
Tema: Crearea
elementelor dinamice
JavaScript și
verificarea
formularelor
Chişinău, 2024
Introducere
În cadrul acestei lucrări de laborator, care are un rol mai mult introducere în bazele
limbajului JavaScript, v-om realiza utilizarea crearea elementelor dinamice în cadrul paginii și
verificarea formularelor. Mai întâi de toate, v-om realiza crearea meniurilor derulante utilizând
JS (în cadrul lucrărilor anterioare am utilizat în aceste scopuri doar CSS). Apoi, în restul părților
lucrării, v-om crea imagini defilante, v-om afișa data și timpul curent în timp real prin utilizarea
SetTimeOut, ClearTimeOut și SetInterval. La fel, v-om verifica și valida formulare și v-om
realiza alte implementări utile (deja la propria dorință) site-ului nostru utilizând JS.
Realizarea lucrării
Haideți mai întâi de toate să realizăm analiza noțiunilor teoretice cu care v-om avea de-a
face în cadrul lucrării, studiind materialele didactice oferite de profesor pe platforma ELSE.
În primul rând... ce este JS? JavaScript este un limbaj de scripting client-side (rulează la
nivelul browser-ului), ce a fost dezvoltat pentru a prelucra informațiile din formulare și a
adăuga dinamism paginilor web. JavaScript este un limbaj interpretat, încorporat de regulă în
paginile HTML. Deși există o oarecare confuzie din cauza asemănării numelui, JavaScript este
defapt un limbaj absolut diferit față de Java, denumirea inițială a acestuia fiindcă LiveScript.
JavaScript are o sintaxă asemănătoare limbajului C sau Java. Acesta este dependent de mediu –
software-ul pe care rulează de fapt programul este browser-ul web (Firefox, Opera, Netscape
Navigator, Internet Explorer, Safari, etc.).
Ce putem face cu JavaScript? Acesta oferă design-erilor HTML posibilitarea de a
executa script-uri la nivelul browser-ului. JavaScript poate reacționa la evenimente, astfel poate
fi configurat să execute o anumită operație atunci când se întâmplă ceva, de exemplu s-a
terminat de încărcat pagina sau user-ul a făcut click pe un element HTML. JavaScript poate citi
și scrie elemente HTML, schimbându-le conținutul. JavaScript poate fi utilizat pentru a valida
datele din formulare înainte de a fi trimise către server. La fel, poate fi utilizat pentru a detecta
tipul browser-ului – în funcție de acesta poate încărca o pagină sau alta (acest lucru poate evita
apariția unor probleme de incompatibilitate cu versiuni mai vechi ale browser-elor). Printre
altele, JavaScript poate fi utilizat pentru a manipula și seta cookie-uri.
Înserarea de cod JavaScript într-o pagină HTML se face prin intermediul tag-ului
<script> în interiorul căruia deja se scriu instrucțiunile propriu-zise. Însă totuși JavaScript nu e
întotdeauna disponibil, astfel unele browsere mai vechi nu recunosc tag-ul <script> și vor
ignora tag-ul script dar vor afișa codul JavaScript inclus. Pentru a evita acest lucru folosim o
sintaxă specială, adică cuprindem instrucțiunile JavaScript în cadrul unui comentariu HTML.
Astfel codul v-a fi precedat de <!-- care este secvența de start a unui comentariu HTML. Pentru
ca motorul de JavaScript să ignore secvența de sfârșit --> a comentariului HTML, utilizăm
secvența // care indică un cometariu JavaScript. Uneori utilizatori pot dezactiva în scopuri de
securitate de la nivelul browser-ului execuția JavaScript-urilor. În acest caz putem afișa un
mesaj folosind următoarea secvența <noscript>.
Cât ține de utilizarea codului JS, putem utiliza JavaScript atât în secțiunea <head> cât şi
în <body>, însă totuși funcţiile JavaScript se definesc de regulă în <head>, deoarece acest
lucru asigură că acea funcţie este încărcată înainte de fi nevoie de ea. Codul JavaScript din
<body> se va executa în momentul în care este încărcată pagina. Script-urile JavaScript pot fi
definite într-un fișier extern cu extensia .js, avantajul fiind că acest fișier poate fi inclus în mai
multe pagini HTML. Includerea unui fișier .js într-o pagină HTML se face de regulă în tag-ul
<head> printr-o construcție de forma <script type="text/javascript"
src="/cale/numefiser.js"></script>. Apropo în cadrul standardului nou HTML5 indicarea
atributului type nu este obligatorie. JavaScript poate fi utilizat și în obiecte de tip form, de
exemplu butoane, acest cod JavaScript se va executa când obiectul este folosit.
JavaScript are trei tipuri primare și anume number, string și boolean, orice altceva
este obiect. Numerele sunt memorate întotdeauna în virgulă flotantă. Numerele hexazecimale
încep cu 0x, iar cele în baza 8 încep cu 0 (lucru, pe care nu toate browser-ele îl suportă). String-
urile sunt secvențe de caractere cuprinse între ghilimele sau apostroafe, ce pot conține \n
(newline), \" (ghilimele), etc. Valorile boolene pot fi true sau false, astfel 0, "0", string-urile
vide, undefined, null, și NaN sunt considerate false, pe când orice altceva este considerat true.
Sintaxa declarării unei variabile constă în utilizarea cuvântului-cheie var, urmat de
numele acesteia. Numele variabilelor sunt case-sensitive și trebuie să înceapă cu o literă. După
cum observăm, spre diferență de alte limbaje de programare, aici variabilele nu au tip, adică
respectiv ele pot reține orice valoare. Cuvântul var este opțional, dacă nu se specifică automat
variabila e considerată globală. Variabilele declarate într-o funcție sunt locale acelei funcții (la
declararea variabilelor locale trebuie obligatoriu var). Variabilele declarate în afara oricărei
funcții sunt globale, adică sunt accesibile oriunde în pagină.
JavaScript oferă operatori aritmetici, de comparație, logici, pe biți, de atribuire și alți
operatori precum new, typeof, delete, etc. Există la fel operatorul + pentru concatenarea string-
urilor și operatorul condițional (sau altfel numit ternal). Testarea egalității prin operatorii == și
!= încearcă să convertească ambii operanzi la același tip înainte de a efectua testul, pe când ===
și !== consideră valorile inegale dacă au tipuri diferite. Comentariile în JavaScript sunt similare
celor din C++ sau Java, adică prin // se indică un comentariu pe o singură linie, iar prin /*...*/
comentariile pe mai multe linii. O instrucțiune compusă este cuprinsă între acolade {…}.
Cât ține de instrucțiunile de decizie, selecția simplă poate fi efectuată prin if-else, iar
selecția multiplă prin switch-case-break. Ca instrucțiuni de ciclare pot fi folosite for simplu,
sau for-in pentru parcurgerea unui masiv oarecare, la fel și while sau do-while. JavaScript
dispune de un mecanism de tratare a excepțiilor aproape identic cu cel din Java. Aruncarea unei
excepții are loc prin cuvântul-cheie throw urmat de o expresie ce este valoarea excepției și
poate fi de orice tip (cel mai adesea un string). Prinderea unei excepții are loc prin blocul try-
catch-finally, unde finally este optional iar în cadrul catch-ului nu se specific sau declară tipul
excepției e.
Sintaxa definirii unei funcții constă în utilizarea cuvântului-cheie function. O funcție
poate fi apelată și poate returna o valoare prin keyword-ul return. Parametrii simpli sunt
transmiși prin valoare, iar obiectele prin referință. Tablourile pot fi create prin intermediul
instrucțiunii new Array() ca tablou condensat sau prin atribuirea directă a elementelor cuprinse
între paranteze pătrate către o variabilă (tablou de literali). Asupra acestui pot fi aplicate
diferite funcții predefinite precum reverse(), de returnare a lungimii length() sau de sortare
sort(). Crearea obiectelor poate fi realizată utilizând obiecte literal, astfel creăm un obiect “gol”
cu ajutorul operatorului new Object(), apoi adăugăm proprietăți precum id sau nume (lucru
care poate fi realizat și cu ajutorul costructorilor în cadrul unui function, unde utilizarea
cuvântului-cheie this este obligatorie). Putem la fel adăuga diferite metode la obiecte,
declarându-le ca function.
Evenimentele sunt acțiuni care pot fi detectate de JavaScript. Putem configura execuția
de acțiuni la detectarea de evenimente, de exemplu dacă s-a efectuat click pe un buton sau s-a
terminat de încărcat pagina. JavaScript permite manipularea unei pagini HTML prin intermediul
Document Object Model (DOM) ce descrie structura paginii HTML (nu cofundați cu XML
DOM). Prin intermediul DOM-ului putem face o mulțime de operații, precum accesarea
elementelor din cadrul unei pagini HTML, schimbarea conținutului unei pagini HTML și
posibilitatea de capturare a evenimentelor atașând handlere de evenimente.
Pentru a schimba conținutul paginii afișate în fereastra browser-ului este necesară
cunoașterea modului de accesare a elementelor. Basic DOM este stardard al W3C și este
compatibil cu majoritatea browser-elor. Elementul care se află la baza ierarhiei este window, și
toate celelalte elemente sunt descendente ale acestuia. Fiecare variabilă JavaScript este un câmp
al acestui obiect, respectiv în DOM toate variabilele se presupun că încep cu “window”. Fiecare
document HTML încărcat într-o ferastră (window) devine un obiect de tip Document, ce pune
la dispoziție metode prin care putem accesa toate elementele HTML din cadrul paginii
respective. Mai jos este prezentată schema ierarhiei de clase DOM:
Câmpurile posibile a obiectului window sunt următoarele:
window - ferestra curentă (de regulă nu se specifică);
self - referință la fereastra curentă, identică cu window (window.window);
parent - referință la fereastra/cadrul părinte al ferestrei/cadrului curent;
top – referință către fereastra navigator-ului situată în prim plan;
frames[] - setul de cadre(frames) afișate, care la rândul lor sunt de tipul window;
frames.length – numărul de cadre din ferestra curentă.
Document - documentul HTML ce este afișat în fereastra curentă;
location - URL-ul documentului afișat în fereastra curentă. Dacă acestă
proprietate primește un nou URL atunci document referit de acest URL este
încărcat. Dacă dorim să facem refresh la pagina curentă putem apela
location.reload();
navigator - referință la un obiect de tip Navigator ce reprezintă browser-ul ce a
încărcat acea pagină. Putem obține numele browserului prin
navigator.appName de exemplu "Netscape". Iar prin navigator.platform,
putem obține numele sistemlui de operare, de exemplu "Win32".
status - șirul de caractere afișat în bara de status a browser-ului, textul căruia
poate fi schimbat printr-o simplă atribuire.
Metodele obiectului window sunt următoarele:
alert(string) - afișează o casuță de dialog ce conține string-ul specificat și un
buton cu eticheta OK;
confirm(string) - afișează o ferestră de confirmare ce conține string-ul specificat
împreună cu butoanele Cancel și OK. Returnează true dacă este apăsat OK, și
false dacă este apăsat Cancel;
prompt(string) – afișează o ferestră de confirmare ce conține string-ul
specificat, un input de tip text împreună cu butoanele Cancel și OK. Returnează
string-ul introdus de user dacă este apăsat OK, null dacă este apăsat Cancel;
open(URL) - deschide o fereastră nouă în care se încarcă documentul specificat
prin URL;
close() - închide fereastra (nu un frame).
Toate proprietățile obiectului document trebuie prefixate de acesta:
anchors[] - un tablou de obiecte de tip Anchor (conțin tag-urile <a name=...>);
applets[] - un tablou de obiecte de tip Applet representând apleții din document.
Proprietățile acestor obiecte sunt câmpurile declarate public în aplet, iar metodele
sunt metodele publice din aplet;
forms[] - un tablou de obiecte de tip Form ce reprezintă formele (formularele)
din document. Dacă documentul conține numai o formă, atunci acesta este
forms[0];
images[] - un tablou de obiecte de tip Image representând imaginile din
document. Dacă dorim să schimbăm o anumită imagine, atribuim noul URL
proprietății src;
Am creat o secțiune cu imagini care sunt afișate orizontal și permit defilarea în caz că
sunt prea multe. Observăm că deoarece nu vreau să salvez imagini pe local, ca să fiu nevoit să
le transmit ulterior împreună cu documentul HTML pentru o afișare corectă pe alte calculatoare
(ceea ce respectiv va duce la mărirea dimensiunii fișierelor laboratorului, care trebuie să se
încadreze în cadrul limitelor stabilite de platforma ELSE). Deci am fost nevoit să recurg la un
mic lifehack în acest sens, și anume am utilizat link-uri directe CDN spre imagini de
dimensiunea 1024x600, și nu am stabilit alte dimensiuni noi prin intermediul atributelor
HTML width și height, ci prin intermediul claselor CSS scrollable-images corespunzătoare
unde am stabilit ca blocul imaginilor defilante să aibă o lățime de 40% prin intermediul
proprietății CSS width, iar pentru fiecare din cele 3 imagini am stabilit lățimea de 300px și
înălțime automată prin intermediul proprietății CSS height cu valoare auto.
Observăm (din codul anexat) că am declarat prin new un obiect de tip Date care
automat a preluat data și timpul curent, însă totul la un loc, acum pentru obținerea orei,
minutelor, secundelor din timp și a zilei, lunii și anului din dată, trebuie să realizăm separarea
(extragerea) prin intermediul funcțiilor corespunzătoare, și dacă în cazul funcțiilor pentru timp
getHours(), getMinutes() și getSeconds() totul este simplu, atunci pentru dată apar anumite
complicații și nuanțe. Astfel de exemplu pentru extragerea anului mai înainte se utiliza funcția
getYear(), însă din cauză că au găsite unele erori legate de ea, aceasta a fost înlocuită cu
getFullYear(). La fel, puteți observa că am adăugat 1 la funcția getMonth() pentru a obține
numărul corect al lunii, fiindcă aceasta returnează valori din intervalul 0-11. După denumire se
poate părea că funcția getDay() ar trebui să returneze ziua, însă defapt aceasta returnează
numărul zilei săptămânii, iar pentru a extrage numărul zilei din dată se utilizează altă funcție, și
anume getDate(). Am realizat afișarea timpului în timp real, folosind setInterval pentru a
actualiza afișarea timpului în fiecare secundă (adică la un interval de 1000 de milisecunde).
Observăm că acesta își v-a face apariția în secțiunea goală div (descrisă în CSS) pentru afișarea
timpului cu identificatorul clock. La fel dimineață culoarea textului va fi albastră iar, după
amiază deja roșu (am realizat acest lucru comparând valoarea variabilei hours).
Astfel, atunci când utilizatorul apasă butonul "Afișează mesaj după un timp
specificat", apare o fereastră de dialog JavaScript de tip prompt care îi permite să introducă
timpul de întârziere în secunde, care după e convertat în milisecunde prin înmulțirea la 1000
deoarece așa argument așteaptă funcția standard setTimeout(), apelată de funcția
delayMessage() pentru a afișa mesajul după o întârziere de interval specificat. Mai întâi însă are
loc verificarea valorii introduse de utilizator (citită prin ParseInt), și anume dacă acesta a
introdus măcar ceva, dacă această valoare este un număr (prin IsNaN) și dacă acestă valoare
este pozitivă. În caz că una din condiții nu a fost îndeplinită se v-a afișa mesajul corespunzător
de tip alert. Apropo dacă apăsăm butonul Cancel din fereatra prompt v-om obține același mesaj
ca și atunci când nu am introdus nimic și am apăsat OK. Dacă totuși am introdus o valoare
validă, numărătoarea v-a începe instant fără alte ferestre suplimentare.
Când timpul specificat va trece (de exemplu fie un timeout de 10 secunde), se va afișa
mesajul corespunzător care arată în felul următor. Observăm că acesta își v-a face apariția în
secțiunea goală div pentru afișarea mesajului cu identificatorul mesaj_timeout.
Dacă utilizatorul apasă butonul "Anulează afișarea mesajului" înainte ca timpul necesar
să se scurgă, funcția JavaScript cancelMessage() este apelată și anulează afișarea mesajului prin
intermediul clearTimeout, apoi prin intermediul metodei getElementByID al obiectului de tip
Document (ce întoarce o referință la primul element cu id-ul specificat) cu proprietatea
innerHTML căreia îi v-om atribui un string vid, facând prin asta ca mesajul să dispară și printr-
un alert v-om informa utilizatorul despre faptul că anularea afișării mesajului a avut loc cu
succes (adică chiar dacă va trece timeout-ul stabilit, nu se va întâmpla nimic). La fel, vreau să
menționez că atât la stabilirea unui timeout nou, cât și la anularea unuia existent, conținutul
secțiunii div cu mesaj este golită.
<!DOCTYPE html>
<html lang="ro">
<head>
<meta charset="utf-8">
<!-- Specificăm Style sheet-ul (CSS) extern cu link-ul către fișierul CSS -->
</head>
<body>
<br>
<div class="dropdown">
<ul type="none">
</ul>
</div>
</div>
<br><br><br><br><br><br><br><br><br><br>
<!-- Imagini defilante -->
<div class="scrollable-images">
<img
src="https://images.wallpaperscraft.ru/image/single/karty_kombinatsiia_chernyj_192979_
3840x2400.jpg" alt="Imagine 1">
<img
src="https://images.wallpaperscraft.ru/image/single/shahmaty_figury_chernobelyj_868183
_1024x600.jpg" alt="Imagine 2">
<img
src="https://images.wallpaperscraft.ru/image/single/kubik_rubika_kubik_grani_913047_10
24x600.jpg" alt="Imagine 3">
</div>
<!--
-->
<div id="clock"></div>
<div id="mesaj_timeout"></div>
<!--
-->
<!--
-->
<script>
<!--
function toggleDropdown() {
document.getElementById("myDropdown").classList.toggle("show");
}
// Afișarea timpului în timp real
function displayTime() {
// Extragem anul
// Extragem luna
// Extragem ziua
// Extragem ora
// Extragem minutele
// Extragem secundele
document.getElementById('clock').style.fontSize = "72px";
if(hours<12) {
} else {
setInterval(displayTime, 1000);
var timeoutID;
var delayTime;
function showMessage() {
var msg = "Acesta este un mesaj afișat după o întârziere de " + delayTime + "
secunde.";
document.getElementById("mesaj_timeout").innerHTML = msg;
function delayMessage() {
return;
delayTime = parseInt(delayTime);
return;
document.getElementById("mesaj_timeout").innerHTML = "";
function cancelMessage() {
if(confirmCancel) {
clearTimeout(timeoutID);
document.getElementById("mesaj_timeout").innerHTML = "";
/*
function validareFormular() {
// Validare nume
if(nume=="") {
return false;
if(!numePattern.test(nume)) {
return false;
if(email=="") {
return false;
if(!emailPattern.test(email)) {
return false;
return false;
if(!telefonPattern.test(telefon)) {
return false;
// Validare mesaj
if(mesaj=="") {
return false;
if(mesaj.length<10) {
return false;
return true;
//-->
</script>
<label for="nume">Nume:</label>
<label for="email">Email:</label>
<label for="telefon">Telefon:</label>
<label for="message">Mesaj:</label><br>
</form>
</body>
</html>
body {
margin: 0;
padding: 0;
/* Culoarea fundalului */
background-color: #F0F0F0;
/* Stilul containerului */
.container {
/* Lățimea maximă */
max-width: 800px;
padding: 20px;
/* Culoarea fundalului */
background-color: #FFF;
/* Colțuri rotungite */
border-radius: 8px;
/* Umbră */
box-shadow: 0 0 10px #0000001a;
.dropdown {
position: relative;
display: inline-block;
/* Conținutul derulant */
.dropdown-content {
display: none;
position: absolute;
/* Culoarea fundalului */
background-color: #FFF;
/* Lățimea minimă */
min-width: 160px;
/* Umbră */
z-index: 1;
/* Colțuri rotungite */
border-radius: 8px;
padding: 10px 0;
.dropdown-content ul {
list-style: none;
padding: 0;
margin: 0;
.dropdown-content ul li a {
display: block;
/* Culoarea textului */
color: #333;
text-decoration: none;
/* Tranziție lină */
.dropdown-content ul li a:hover {
background-color: #F9F9F9;
.dropdown:hover .dropdown-content {
display: block;
.dropbtn {
/* Culorea fundalului */
background-color: #4CAF50;
/* Culorea textului */
color: white;
/* Dimensiunile font-ului */
font-size: 16px;
/* Fără margine */
border: none;
/* Colțuri rotungite */
border-radius: 8px;
cursor: pointer;
/* Tranziție lină */
}
/* Când mouse-ul e deasupra butonului */
.dropbtn:hover {
background-color: #45A049;
.scrollable-images {
/* Lățimea în procente */
width: 40%;
margin-left: 25px;
overflow-x: auto;
white-space: nowrap;
/* Spațiu de sus */
margin-bottom: 20px;
.scrollable-images img {
width: 300px;
/* Înălțime automată */
height: auto;
display: inline-block;
margin-right: 10px;
/* Colțuri rotungite */
border-radius: 8px;
/* Umbră */
/* Stilul formularului */
form {
/* Lățimea */
width: 500px;
background-color: #F9F9F9;
padding: 20px;
/* Colțuri rotungite */
border-radius: 8px;
/* Umbră */
/* Etichetele formularului */
label {
display: block;
/* Spațiu de sus */
margin-bottom: 5px;
/* Text îngroșat */
font-weight: bold;
/* Câmpurile formularului */
input[type="text"],
input[type="email"],
input[type="tel"],
textarea {
/* Lățimea */
width: 90%;
padding: 10px;
/* Spațiu de sus */
margin-bottom: 10px;
/* Colțuri rotungite */
border-radius: 5px;
box-sizing: border-box;
/* Butonul de confirmare */
input[type="submit"] {
/* Culoarea fundalului */
background-color: #4CAF50;
/* Culoarea textului */
color: #FFF;
/* Lipsă margine */
border: none;
/* Colțuri rotungite */
border-radius: 5px;
cursor: pointer;
/* Dimensiunea font-ului */
font-size: 16px;
input[type="submit"]:hover {
background-color: #45A049;
#mesaj_timeout {
margin-left: 12px;
/* Dimensiunea font-ului */
font-size: 24px;
/* Culoarea textului */
color: #900;
/* Spațiu de sus */
margin-top: 10px;
.cst-btns {
/* Culoarea fundalului */
background-color: #4CAF50;
/* Culoarea text-ului */
color: #FFF;
/* Fără margine */
border: none;
/* Colțuri rotungite */
border-radius: 5px;
cursor: pointer;
/* Dimensiunea font-ului */
font-size: 16px;
.cst-btns:hover {
background-color: #45A049;