Agora
Media
Libraria Byblos



AgoraNews  





PC Magazine Ro  




NET Report   




Ginfo   




agora ON line   





PC Concrete   





Liste de discuții   




Cartea de oaspeți   




Mesaje   





Agora   








Clic aici
PC Report - ultimul numar aparut


Soluții - PC Magazine Romania, Iulie  2002

Soluții web client-side cu JavaScript

Iulian Radu

Scrierea corectă a unei bucăți de cod în JavaScript
În acest articol vor fi prezentate modurile în care se scrie corect un cod JavaScript în cadrul paginilor web. Pentru început, o variantă care afișează un mesaj în navigatoarele care nu știu de existența tag-urilor <SCRIPT>:

1. <SCRIPT LANGUAGE="JavaScript">
2. <!— Mesajul care urmează va fi afișat doar de navigatoarele care nu înțeleg JavaScript —>->
3. <!— —> <HR><H1>Această pagină necesită JavaScript</H1>1>
4. <!— —> Navigatorul dumneavoastră web nu este capabil să execute programe în JavaScript,t,
5. <!— —> astfel încât nu puteți să folosiți această pagină. Vă rugăm să luați în considerare folosireaea
6. <!— —> ultimei versiuni a navigatorului Netscape Navigator sau Microsoft Internet Explorer.r.
7. <!— —> <HR> >
8. <!— începem comentariul HTML care ascunde script-ull
9. Codul JavaScript este introdus aici -.
10. // terminarea comentariului HTML care ascunde script-ul —>>
11. </SCRIPT>

Liniile 1 și 11 delimitează scriptul nostru în JavaScript. Deoarece JavaScript recunoaște succesiunile de caractere "<!—-" și "//" ca începutul unui comentariu ce se termină la sfârșitul liniei, ne vom folosi de acest lucru. JavaScript va considera că în liniile 2-8 și 10 avem comentarii și le va ignora. În schimb, navigatorul va considera comentariu doar ce se află între "<!—-" și "—>>". Astfel, el va afișa codul HTML aflat în liniile 3-7, dar va considera comentariu tot ce se află în liniile 2 și 8-10. Atenție, nu fiți tentați în baza exemplelor următoare să puneți cod JavaScript după "<!—-". Tot ce va apărea după aceste caractere va fi ignorat (vezi mai sus explicațiile).

Dacă o pagină de web conține cod JavaScript, înseamnă că are nevoie de el și dacă pagina trebuie să fie funcțională pentru vizitator, atunci singura soluție este să creăm o variantă a paginii în format HTML pur și să facem apel la scripturile CGI. În continuare este dată varianta în care pagina ce folosește JavaScript este diferită de cea cu HTML pur. Vizitatorul trebuie să acceseze în mod implicit pagina cu HTML pur care va conține la începutul ei următorul cod:

1. <HEAD>
2. <SCRIPT LANGUAGE="JavaScript"> <!— încep ascunderea script-ull
3. window.location = "my_js_home_page.html";
// termin ascunderea script-ului —>>
4. </SCRIPT>
5. <TITLE>Pagina mea de intrare
(Versiunea care nu înțelege JavaScript)</TITLE>
6. </HEAD>
7. <BODY>
8. Pagina în format HTML
pur este introdusă aici -.
9. </BODY>

În linia 3 indicăm navigatorului că dorim să accesăm o nouă pagină denumită "my_js_home_page.html" și care este echivalentul paginii curente, doar că include și cod JavaScript. Trebuie remarcat că dacă utilizatorul folosește butonul BACK al navigatorului, se va întoarce la această pagină care îl va retrimite în cea care conține cod JavaScript. În acest fel este creată o buclă. Soluția constă în folosirea funcției "location.replace". Un exemplu de utilizare a acestei funcții apare în unul din exemplele următoare.

Dacă avem multe pagini ce conțin scripturi JavaScript, atunci este indicat ca denumirile paginilor cu cod JavaScript să fie asemănătoare cu cele ce conțin doar cod HTML pur. Să presupunem că paginile cu cod JavaScript au prefixul js_. În acest caz se poate folosi scriptul următor (în realitate scriptul este mai complex pentru că trebuie să se țină cont de separatorul folosit de sistemul de operare de pe serverul de web pentru separarea numelor de directoare și fișiere în cadrul definirii căilor) în locul celui precedent:

1. <SCRIPT> <!— încep ascunderea script-ull
2. var path = window.location.path;
3. var filename = path.substring(path.lastIndexOf("/") + 1, path.length);
4. window.location = path.substring
(0, path.lastIndexOf("/")) + "/js_" + filename;
5. // termin ascunderea script-ului
—>> </SCRIPT>

În linia 2 obțin URL-ul paginii curente, din care obțin în linia 3 în variabila filename numele paginii curente. În linia 4 îi indic navigatorului numele noii pagini pe care doresc să o încarce și să o afișeze.

Soluțiile prezentate până acum afișau un mesaj care indica lipsa facilităților de script în navigatoarele care înțeleg doar HTML.
În continuare este prezentată o soluție pentru cazul în care sunt necesare facilitățile oferite de JavaScript 1.1, dar navigatorul recunoaște doar JavaScript 1.0:

1. <SCRIPT LANGUAGE="JavaScript"> <!—-
2. _version = 10; // —>> </SCRIPT>
3. <SCRIPT LANGUAGE="JavaScript1.1"> <!—-
4. _version = 11; // —>> </SCRIPT>
5. <SCRIPT LANGUAGE="JavaScript"> <!—-
6. if (_version < 11) {
7. document.write('<HR><H1>
Această pagină necesită JavaScript 1.1</H1>');
8. document.write('Navigatorul
dumneavoastră acceptă doar JavaScript 1.0<HR>');
9. }
10. // —>> </SCRIPT>
11. <SCRIPT LANGUAGE="JavaScript1.1">
12. <!— Mesajul care urmează va fi afișat doar de navigatoarele care nu înțeleg JavaScript —>->
13. <!— —> <HR><H1>Această pagină necesită JavaScript 1.1</H1>1>
14. <!— —> Navigatorul dumneavoastră nu poate executa script-uri JavaScript.<HR>R>
15. <!— încep ascunderea script-ull
16. Codul JavaScript 1.1 este introdus aici -.
17. // termin ascunderea script-ului —>>
18. </SCRIPT>

În liniile 2 și 4 atribuim variabilei _version un cod ce ne indică numărul celei mai noi versiuni de JavaScript înțeleasă de către navigator. În liniile 6-9 afișăm mesajul de avertizare dacă nu este suportat JavaScript 1.1, dar este suportat JavaScript 1.0. În liniile 13 și 14 afișăm mesajul în navigatoarele care nu înțeleg scripturi.

Dacă dorim să încărcăm o nouă pagină atunci codul va arăta așa:

1. <SCRIPT LANGUAGE="JavaScript1.1"> <!—-
2. location.replace(unescape(location.search.substring(1)));
3. self.loading = true;
4. // —>> </SCRIPT>
5. <SCRIPT LANGUAGE="JavaScript">
6. <!— —> <HR><H1> Această pagină necesită JavaScript 1.1</H1>1>
7. <!— —> Navigatorul dumneavoastră nu poate executa script-uri JavaScript.<HR>R>
8. <!—
9. if (!self.loading) {
10. document.write('<HR><H1> această pagină necesită JavaScript 1.1</H1>');
11. document.write('Navigatorul dumneavoastră acceptă doar JavaScript 1.0<HR>');
12. }
13. // —>>
14. </SCRIPT>

Avantajul acestui script este că obține adresa paginii ce conține codul JavaScript 1.1 direct din URL-ul paginii curente; se presupune că aceasta a fost apelată în genul:

http://site/path/html_js1.0.html?path2/html_js11.html

În linia 2 observăm folosirea funcției "replace" a obiectului Location (aminteam la începutul articolului). Apelarea acestei funcții va conduce la înlocuirea paginii curente cu cea specificată, atât pe ecran cât și în lista history a navigatorului (lista cu URL-urile vizitate). Citirea din "location.search" ne întoarce șirul care apare după semnul întrebării în URL-ul paginii curente (inclusiv semnul întrebării). De aceea vom extrage din acest șir toate caracterele cu excepția primului (aplicarea funcției "substring" cu argumentul 1). Definim și o proprietate atribuită ferestrei curente ("self" este identic cu "window") denumită "loading" și care să ne indice dacă este în curs de încărcare pagina în format JavaScript 1.1.

Se observă că în liniile 8 și 13 nu am mai pus și comentariul care indica rolul acelor linii. Acest lucru nu este bun, deoarece în cadrul unor script-uri mari este posibil să nu mai fie evident rolul lor.

Dacă navigatorul dumneavoastră știe JavaScript, dar în cadrul tag-ului <SCRIPT> nu recunoaște atributul SRC, se poate utiliza următoarea variantă:

1. <SCRIPT SRC="utils.js"> <!—-
2. var path = location.path;
3. location = path.substring(0, path.lastIndexOf("/")) +"utils.html";
4. // —>></SCRIPT>

În linia 3 apelăm o pagină web care are inclusă în ea codul scriptului JavaScript aflat în fișierul de sine stătător "utils.js".

Obținerea de date despre navigatorul web

1. <SCRIPT LANGUAGE="JavaScript">
2. function _get_version() {
3. return Math.round(parseFloat(navigator.appVersion) * 1000);
4. }
5. function _get_os() {
6. if (navigator.appVersion.indexOf("Win95") > 0) return "WIN95";
7. else if (navigator.appVersion.indexOf("Win16") > 0) return "WIN31";
8. else if (navigator.appVersion.indexOf("Win") > 0) return "WIN";
9. else if (navigator.appVersion.indexOf("Mac") > 0) return "MAC";
10. else if (navigator.appVersion.indexOf("X11") > 0) return "UNIX";
11. else return "UNKNOWN";
12. }
13. var browser = new Object();
14. if (navigator.appName.substring(0,8) == "Netscape") {
15. browser.name = "NN"; }
16. else if (navigator.appName.substring(0,9) == "Microsoft") {
17. browser.name = "MSIE"; }
18. else {
19. browser.name = navigator.appName; }
20. browser.version = _get_version();
21. browser.os = _get_os();
22. browser.langlevel = 1000;
23. </SCRIPT>
24. <SCRIPT LANGUAGE="JavaScript1.1">
25. browser.langlevel = 1100;
26. </SCRIPT>
27. <SCRIPT LANGUAGE="JavaScript1.2">
28. browser.langlevel = 1200;
29. </SCRIPT>

În liniile 2-4 definim o funcție denumită "_get_version" care extrage versiunea și o prelucrează. De exemplu, va întoarce 3000 pentru Internet Explorer 3.0. Funcția "_get_os" definită în liniile 5-12 încearcă să identifice sistemul de operare. În linia 13 creăm un obiect denumit "browser" și care nu are nici o proprietate. În liniile 14-19 definim o proprietate denumită "name", în care memorăm un cod ce identifică numele firmei care a creat navigatorul. În liniile 20 și 21 creăm alte două proprietăți (denumite "version" și "os") care memorează ce versiune de navigator afișează pagina și pe ce sistem de operare. În liniile 22 și 24-29 identificăm versiunea cea mai recentă de JavaScript pe care o înțelege acest navigator.

Afișarea unei ferestre de erori mai detaliată
De multe ori constatăm că avem o eroare în codul nostru JavaScript, dar nu primim nici o informație din partea navigatorului ca să identificăm unde anume este ea. De aceea, cea mai bună metodă este de a ne crea propria funcție de afișare în caz de eroare.
Iată o astfel de soluție:

<SCRIPT LANGUAGE="JavaScript">
function report_error(msg, url, line) {
var w = window.open("","error_javascript","resizable,status,width=600,height=400");
var d = w.document;
d.write('<DIV align=center>');
d.write('<H1><B>Eroare JavaScript detectată !</B></H1>');
d.write('<HR SIZE=4 WIDTH="80%">');
d.write('<INPUT TYPE="button" VALUE="Dismiss" onClick="self.close()">');
d.write('</DIV><DIV align=right>');
d.write('<BR>Mesaj de eroare: ' + msg);
d.write('<BR>Document: ' + url);
d.write('<BR>Număr line: ' + line);
d.write('<BR>Versiune navigator: ' + navigator.userAgent);
d.write('</DIV>');
d.close();
return true;
}
self.onerror = report_error;

</SCRIPT>
Pentru a testa funcționarea, puteți introduce ulterior următoarea comandă JavaScript care va activa apelarea funcției "report_error":

</SCRIPT>
self=null;
</SCRIPT>

Se observă că funcția va afișa în cadrul aceleiași ferestre toate mesajele de anunțare a erorilor JavaScript. Astfel, la sfârșit va fi afișată practic ultima eroare întâlnită. Dacă se dorește ca pentru fiecare eroare să fie afișată o fereastră diferită se poate implementa o variabilă care să memoreze a câta eroare este și care să fie adăugată la numele ferestrei care se deschide.

Afișarea unei liste cu proprietățile unui obiect
Acest script va afișa toate proprietățile obiectului specificat:

1. <SCRIPT LANGUAGE="JavaScript">
2. function display_prop(obj, pad) {
3. for(i in obj){
4. the_obj=obj[i];
5. the_type=typeof(the_obj);
6. the_pad=pad+"."+i;
7. str=" <b>"+the_pad+":</b> "+the_obj+" <i>("+the_type+")</i>";
8. document.write(str+"<br>"); }
9. }
10. display_prop(self,"self",1);
11. </SCRIPT>

În liniile 2-9 definim funcția care va afișa proprietățile obiectului respectiv. Argumentul "obj" va primi obiectul ale cărui proprietăți dorim să le vizualizăm și "pad" va conține un șir care va fi afișat în fața proprietăților obiectului (cel mai indicat este să fie chiar numele obiectului). În cazul nostru, afișăm toate proprietățile ferestrei curente (obiectul referit prin "self"; vezi linia 10). Deoarece în JavaScript proprietățile unui obiect pot fi accesate ca și cum am avea o listă asociativă, în linia 3 ne folosim de bucla de tip for/in pentru a extrage numele proprietăților obiectului. Creăm o nouă scurtătură denumită "the_obj" spre proprietatea obiectului (care poate fi la rândul lui un obiect). Folosim funcția "typeof" pentru a obține un șir ce descrie de ce tip este argumentul trimis ei la apelare. Șirul întors va aparține unuia dintre următoarele tipuri: "boolean", "function", "number", "object", "string" sau "undefined". În variabila "str" asamblăm șirul care va fi introdus în document folosind funcția "document.write".

Afișarea datei la care a fost modificată pagina

<SCRIPT LANGUAGE="JavaScript">
document.write(document.lastModified);
</SCRIPT>

Pur și simplu afișăm șirul întors de citirea proprietății "lastModified" a obiectului ce reprezintă documentul curent. Pentru a vedea ce alte proprietăți mai sunt asociate obiectului Document, folosiți scriptul dat în cadrul exemplului "Afișarea unei liste cu proprietățile unui obiect", apelând funcția astfel "display_prop(self.document,' self.document')".
AfiȘarea unui ceas în linia de stare

1. <SCRIPT LANGUAGE="JavaScript">
2. function display_time_in_status_line(){
3. var d = new Date();
4. var h = d.getHours();
5. var m = d.getMinutes();
6. var ampm = (h >= 12)?"PM":"AM";
7. if (h > 12) h -= 12;
8. if (h == 0) h = 12;
9. if (m < 10) m = "0" + m;
10. defaultStatus = h + ':' + m + ' ' + ampm;
11. setTimeout("display_time_in_status_line()", 60000);
12. }
13. </SCRIPT>
14. <BODY onLoad="display_time_in_status_line();">
15. -.
16. </BODY>

În liniile 2-13 definim o funcție care va afișa în linia de status a navigatorului (cea de la baza ferestrei acestuia) timpul curent. În linia 3 creăm o variabilă denumită "d", care va conține ora curentă. În liniile 4 și 5 extragem ora și minutele în variabilele "h" și respectiv "m". Atribuim lui ampm, în linia 6, un șir care identifică în care jumătate a zilei ne aflăm. În liniile 7-9 facem pregătirile pentru o afișare frumoasă a timpului curent. În linia 10 stabilim ca valoare implicită a textului afișat în linia de status timpul curent (el va fi modificat temporar când se va atribui o valoare proprietății "status" a ferestrei curente). În linia 11 instruim navigatorul să apeleze în mod automat această funcție după un minut (un minute conține 60000 ms). Această funcție va fi prima dată apelată după ce întreaga pagină a fost încărcată (pentru aceasta folosim evenimentul "onLoad" al ferestrei curente).

Afișarea unei liste cu cookie-urile care se aplică documentului curent

1. <SCRIPT LANGUAGE="JavaScript">
2. function display_cookies(){
3. var cookies=document.cookie.split(";");
4. str="Cookie-urile documentului curent:\n\n";
5. for(i=0; i<cookies.length; i++){
6. str += unescape(cookies[i]) + "\n";}
7. alert(str);
8. }
9. </SCRIPT>

Deoarece citirea din "document.cookie" întoarce un șir ce conține subșiruri de tipul "nume=valoare" despărțite prin virgulă, apelăm la funcția "split" care va crea o listă cu aceste subșiruri. Fiecare element al acestei liste va fi de forma: nume_cookie=valori

Apelarea unui URL pe baza unei liste

1. <SCRIPT LANGUAGE="JavaScript">
2. function go_there(){
3. var f=document.the_form.the_select.options;
4. for(i=0; i<f.length; i++) {
5. if( f[i].selected ) {
6. location = f[i].value;
7. break; }
8. }
9. }
10. </SCRIPT>
11. </HEAD>
12. <BODY>
13. <FORM NAME="the_form" onSubmit="go_there(); return false;">
14. <INPUT TYPE=submit VALUE="Vizualizare">
15. <SELECT NAME="the_select" SIZE=10>
16. <OPTION VALUE="content.html" SELECTED>Cuprins
17. -.
18. <OPTION VALUE="index-example.html">Index exemple
19. </SELECT>
20. </FORM>
21. </BODY>

Acest script ne permite să afișăm o listă de URL-uri și după alegerea descrierii unuia dintre ele și apelarea butonului "Vizualizare" să vedem pagina corespunzătoare. Pentru aceasta folosim handler-ul de evenimente "onSubmit" asociat tag-ului "FORM" (vezi linia 13) din care apelăm funcția definită în liniile 2-9. Întoarcem "false" ca să nu încerce și navigatorul apelarea URL-ului asociat form-ului. În cadrul funcției, în linia 3, creăm o scurtătură definind variabila f ce conține referința la opțiunile tag-ului "SELECT" denumit "the_select". În liniile 4-8 căutăm acea opțiune care este selectată și folosim valoarea câmpului "VALUE" a acelei opțiuni pentru a apela noua pagină. Deoarece am solicitat deja afișarea noului URL, nu mai are rost să continuăm ciclul. Dacă modificați numele form-ului sau al select-ului, nu uitați să modificați și în script numele asociat lor.

Animație de imagini

1. <IMG SRC="frame0.gif" NAME=animation>
2. <SCRIPT LANGUAGE="JavaScript1.1">
3. var max_frame = 10;
4. var num_loaded_images = 0;
5. var frame = 0;
6. var timeout_id = null;
7. function count_images() {
8. num_loaded_images++;
9. if (num_loaded_images == max_frame){
10. animate();}
11. }
12. images = new Array(max_frame);
13. for(var i = 0; i < max_frame; i++) {
14. images[i] = new Image();
15. images[i].onload = count_images;
16. images[i].src = "frame" + i + ".gif";
17. }
18. function animate(){
19. document.animation.src = images[frame].src;
20. frame = (frame + 1)%max_frame;
21. timeout_id = setTimeout("animate()", 250);
22. }
23. </SCRIPT>
24. <FORM>
25. <INPUT TYPE=button VALUE="Start" onClick="if (timeout_id==null && num_loaded_images==max_frame) animate()">
26. <INPUT TYPE=button VALUE="Stop" onClick="if (timeout_id) clearTimeout(timeout_id); timeout_id=null;">
27. </FORM>

În linia 1 afișăm prima imagine din animație; restul de imagini trebuie să aibă exact aceleași dimensiuni ca și aceasta. Îi dăm și un nume pentru a ne putea referi ușor la ea când trebuie să o înlocuim. În liniile 3-6 definim variabile în care memorăm câte frame-uri are animația, numărul de imagini off-screen deja încărcate, numărul frame-ului care trebuie să fie afișat (0-max_frame-1) și, respectiv, o variabilă a cărei valoare să ne indice dacă trebuie să acceptăm pornirea/oprirea animației. Funcția "count_images", definită în liniile 7-11, înregistrează câte imagini au fost încărcate. În momentul când au fost toate aduse în cache-ul local se pornește în mod automat animația (vezi liniile 9 și 10). În linia 12 definim variabila de tip listă care va conține toate imaginile off-screen. În liniile 14-16 aducem imaginile și ne folosim de handler-ul de evenimente "onload" al obiectului Image pentru a putea înregistra câte imagini au fost aduse. Atenție, ordinea liniilor 15 și 16 nu poate fi schimbată, existând altfel riscul ca o imagine să fie luată din cache-ul navigatorului și să nu fie înregistrată ca adusă. Funcția "animate" realizează animația propriu-zisă. De remarcat că tot ce avem de făcut este să modificăm valoarea proprietății "src" a imaginii deja afișate pentru a afișa noua imagine. În linia 21 instruim navigatorul să apeleze din nou această funcție după 1/4 minute (creăm o animație de 4 fps). În liniile 24-27 construim două butoane care ne permit să pornim/oprim animația.
Verificarea câmpurilor unui form

1. <SCRIPT LANGUAGE="JavaScript1.1">
2. function isblank(s) {
3. for(var i = 0; i < s.length; i++) {
4. var c = s.charAt(i);
5. if ((c != ' ') && (c != '\n') && (c != '\t')) {
6. return false; }
7. }
8. return true;
9. }
10. function verify(f) {
11. var msg, empty_fields = "", errors = "";
12. for(var i = 0; i < f.length; i++) {
13. var e = f.elements[i];
14. if (((e.type == "text") || (e.type == "textarea")) && !e.optional) {
15. if ((e.value == null) || (e.value == "") || isblank(e.value)) {
16. empty_fields += "\n " + e.name;
17. continue; }
18. if (e.numeric || (e.min != null) || (e.max != null)) {
19. var v = parseFloat(e.value);
20. if (isNaN(v) || ((e.min != null) && (v < e.min)) || ((e.max != null) && (v > e.max))) {
21. errors += "- The field " + e.name + " must be a number";
22. if (e.min != null) {
23. errors += " that is greater than " + e.min; }
24. if (e.max != null && e.min != null) {
25. errors += " and less than " + e.max; }
26. else if (e.max != null) {
27. errors += " that is less than " + e.max; }
28. errors += ".\n"; }
29. }
30. }
31. }
32. if (!empty_fields && !errors) return true;
33. msg += "Form-ul nu poate fi trimis deoarece are următoarele erori.\n____\n\n"
34. if (empty_fields) {
35. msg += "- The following required field(s) are empty:" + empty_fields + "\n";
36. if (errors) {
37. msg += "\n"; }
38. }
39. msg += errors;
40. alert(msg);
41. return false;
42. }
43. </SCRIPT>
44. <FORM onSubmit="
45. this.firstname.optional = true;
46. this.phonenumber.optional = true;
47. this.zip.min = 0;
48. this.zip.max = 99999;
49. return verify(this);">
50. Nume: <INPUT TYPE=text NAME="firstname">
51. Prenume: <INPUT TYPE=text NAME="lastname"><BR>
52. Adresă:<BR><TEXTAREA NAME="address" ROWS=4 COLS=40></TEXTAREA><BR>
53. Cod poștal: <INPUT TYPE=text NAME="zip"><BR>
54. Număr de telefon: <INPUT TYPE=text NAME="phonenumber"><BR>
55. <INPUT TYPE=submit>
56. </FORM>

În liniile 2-9 definim o funcție denumită "isblank" care întoarce "true" dacă șirul trimis ca argument este gol sau conține doar caractere spații. În liniile 10-42 definim funcția "verify" care primește ca argument form-ul ce trebuie verificat. Această funcție va fi apelată din handler-ul de evenimente "onSubmit" al form-ului (vezi liniile 44-49). În linia 13 definim variabila "e" care va conține pe rând fiecare element al form-ului. Ne interesează doar elementele de tip "text" și "textarea" care nu sunt opționale (vezi linia 14). Dacă avem un astfel de câmp și este gol atunci îl adăugăm la lista de câmpuri goale, denumită "empty_fields" (vezi liniile 15-17). Apoi verificăm dacă câmpurile trebuie să fie de tip numeric (au una din următoarele proprietăți: "numeric", "min" sau "max") și dacă se încadrează în limitele stabilite (vezi liniile 18-29). Dacă totul este în regulă, în linia 32 terminăm executarea funcției intorcând valoarea "true". În liniile 33-40 pregătim mesajul și îl afișăm, iar în linia 41 terminăm funcția întorcând valoarea "false", care la rândul ei este întoarsă navigatorului și care îi indică faptul că form-ul nu trebuie să fie trimis. Liniile 50-54 conțin câmpurile form-ului, iar în linia 55 definim butonul de trimitere a form-ului.


PC Magazine Ro | CD ROM | Redactia | Abonamente | CautareArhive

Copyright © 1999-2002 Agora Media.

[email protected]

LG - LifeŽs Good

www.agora.ro

deltafri

www.agora.ro

www.agora.ro

www.agora.ro