AWWW-1st3.6-l03.tresc-1.0

From Studia Informatyczne

Aplikacje WWW - laboratorium

Język JavaScript

Celem ćwiczenia jest przygotowanie formularza na stronie WWW z wykorzystaniem języka JavaScript. Formularz ten będzie sprawdzany pod względem zawartości przed wysłaniem do serwera. Formularz będzie miał charakter dynamiczny, tzn. niektóre jego elementy będą zmieniać swój stan pod wpływem działań użytkownika. Do wykonania ćwiczenia potrzebny jest dowolny edytor plików tekstowych oraz przeglądarka internetowa.

1. Stwórz dwa pliki tekstowe znajdujące się w tym samym katalogu dyskowym: formularz.htm i form_check.js.

2. Formularz ma służyć do wprowadzania danych potrzebnych do rejestracji w pewnym serwisie internetowym. Potrzebne informacje to przede wszystkim dane osobowe. W celu utworzenia formularza wykorzystaj element FORM języka HTML. Formularz o nazwie formularz1 powinien umożliwiać wprowadzanie następujących danych: imię, nazwisko, płeć(wybór jednej z opcji), nazwisko panieńskie, e-mail, ulica, kod pocztowy, miasto, uwagi (pole tekstowe). Dla lepszej wizualizacji formularza pola można umieścić w komórkach tabeli. Zawartość pliku formularz.htm powinna być następująca:

<html>
<head>
  <title>Javascript</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
  <center>
    <form name="formularz1">
      <table border=0>
        <tr><td align="right">Imię</td>
            <td><input type=text name="f_imie"></td></tr>
        <tr><td align="right">Nazwisko</td>
            <td><input type=text name="f_nazwisko"></td></tr>
        <tr><td align="right">Płeć</td>
            <td align="left">
               <input name="f_plec" value "f_k" checked type="radio"/>
                      kobieta<BR>
               <input name="f_plec" value="f_m" type="radio"/>
                      mężczyzna</td></tr>
        <tr><td align="right">Nazwisko panieńskie</td>
            <td><input type=text name="f_nazwisko_p"></td></tr>
        <tr><td align="right">E-mail</td>
            <td><input type=text name="f_email"></td></tr>
        <tr><td align="right">Kod pocztowy</td>
            <td><input type=text name="f_kod_pocztowy"></td></tr>
        <tr><td align="right">Ulica/Osiedle</td>
            <td><input type=text name="f_ulica"></td></tr>
        <tr><td align="right">Miasto</td>
            <td><input type=text name="f_miasto"></td></tr>
:  <tr><td align="right">Uwagi</td>
            <td><textarea rows="5" cols="15" name="field1"
                 id="idfield1"> </textarea></td></tr>
        <tr><td colspan="2" align="center">
            <input type="button" value="Przeslij"></td></tr>
      </table>
    </form>
  </center>
</body>
</html>

Plik jest wyświetlany przez przeglądarkę w następujący sposób

Image:AWWW-1st3_6-l03_tresc-1_0_01.png

3. W pliku form_check.js umieść definicje funkcji, które będą sprawdzały elementarne warunki, jakie powinny spełniać wartości wprowadzane do formularza. Sprawdzana powinna być długość napisu, format kodu pocztowego oraz adresu poczty internetowej.

// wyswietla na ekranie komunikat o wymaganym polu
function showWarrningReq(mesg)
{
:alert(’pole "’ + mesg + ’" jest wymagane’)
:return true
}

// zwraca wartosc prawda jesli przekazany argument to cyfra
function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

// zwraca wartosc prawda jesli przekazany argument to pusty lancuch
function isEmpty(st)
{
:if (st.length == 0)
:{
return true
}
else
return false
}

// zwraca wartosc prawda jesli przekazany argument to ciag bialych znakow
function isWhiteSpace(st)
{
:var ws = "\t\n\r ";

:for (i = 0; i < st.length; i++)
:{
var c = st.charAt(i);
if ( ws.indexOf(c) == -1)
return false;
}
return true;
}

// zwraca wartosc prawda jesli przekazany argument to niepusty lancuch,
// ktory nie zawiera tylko bialych znakow
function checkString(st, mesg)
{
:if ( isWhiteSpace(st)  | isEmpty(st) )
:{
showWarrningReq(mesg);
return false;
}
else
return true
}

// zwraca wartosc prawda jesli przekazany argument to poprawny kod
// pocztowy
function checkPostalCode(st)
{
:var s = st;

:if (s.length == 6 )
:{
if ( (s.charAt(2)) == "-" )
{
                  if ( isDigit(s.charAt(0)) &&  isDigit(s.charAt(1)) &&
                       isDigit(s.charAt(3)) &&  isDigit(s.charAt(4)) &&
                       isDigit(s.charAt(5)) )
{
return true;
}
else
alert("Zły kod pocztowy");
}
else
alert("Zły kod pocztowy");
}
else
alert("Zły kod pocztowy");
}

// zwraca wartosc prawda jesli przekazany argument to poprawny adres email
function checkEmail(st)
{
:if (isWhiteSpace(st))
alert("Podaj właściwy e-mail");
else
{
at = st.indexOf("@")
if (at < 1)
{
alert("Nieprawidłowy e-mail")
return false
}
else
{
var l;
l= -1;
for (var i = 0; i < st.length; i++)
{
var c = st.charAt(i);
if ( c == ".")
l = i;
}
if ( (l < (at+2) )  | (l == st.length-1) )
alert("Nieprawidłowy e-mail");
}
return true;
}
}

4. Dodaj do powyższego kodu funkcję, która dla każdego sprawdzanego pola formularza wywoła odpowiednie metody do sprawdzenia elementarnych warunków.

function validate(form)
{
:return (
:checkString(form.elements["f_imie"].value, ’imię’) &&
      checkString(form.elements["f_nazwisko"].value,’nazwisko’) &&
      checkEmail(form.elements["f_email"].value) &&
      checkPostalCode(form.elements["f_kod_pocztowy"].value) &&
      checkString(form.elements["f_ulica"].value,’ulica/osiedle’) &&
      checkString(form.elements["f_miasto"].value,’miasto’)   )
}

5. Dodaj do nagłowka HTML (sekcja <head>...</head>) w pliku formularz.htm odwołanie do zewnętrznego pliku (form_check.js) zawierającego skrypt w języku JavaScript. Dodaj do formularza wywołanie funkcji validate w wyniku zajścia zdarzenia polegającego na zatwierdzeniu tego formularza. Ostatecznie plik powinien zawierać następujący kod:

<html>
<head>
  <title>Javascript</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  <script src="form_check.js"></script>
</head>
<body>
  <center>
    <form name="formularz1">
      <table border=0>
        <tr><td align="right">Imię</td>
            <td><input type=text name="f_imie"></td></tr>
        <tr><td align="right">Nazwisko</td>
            <td><input type=text name="f_nazwisko"></td></tr>
        <tr><td align="right">Płeć</td>
            <td align="left">
               <input name="f_plec" value "f_k" checked type="radio"/>
                      kobieta<BR>
               <input name="f_plec" value="f_m" type="radio"/>
                      mężczyzna</td></tr>
        <tr><td align="right">Nazwisko panieńskie</td>
            <td><input type=text name="f_nazwisko_p"></td></tr>
        <tr><td align="right">E-mail</td>
            <td><input type=text name="f_email"></td></tr>
        <tr><td align="right">Kod pocztowy</td>
            <td><input type=text name="f_kod_pocztowy"></td></tr>
        <tr><td align="right">Ulica/Osiedle</td>
            <td><input type=text name="f_ulica"></td></tr>
        <tr><td align="right">Miasto</td>
            <td><input type=text name="f_miasto"></td></tr>
:  <tr><td align="right">Uwagi</td>
            <td><textarea rows="5" cols="15" name="field1"
                 id="idfield1"> </textarea></td></tr>
        <tr><td colspan="2" align="center">
            <input type="button" value="Przeslij"
                   onClick="validate(this.form);"></td></tr>
      </table>
    </form>
  </center>
</body>
</html>

6. Uruchom plik w przeglądarce. Przetestuj działanie formularza wprowadzając poprawne i niepoprawne dane oraz pozostawiając niektóre pola puste.

Image:AWWW-1st3_6-l03_tresc-1_0_02.png


7. Kolejnym krokiem ćwiczenia będzie rozbudowanie formularza w taki sposób, aby pole „nazwisko panieńskie" było dostępne tylko dla osoby, która jest kobietą. W tym celu konieczne będzie obsłużenie zdarzenia polegającego na przełączeniu pomiędzy wartościami kobieta/mężczyzna. W zależności od kierunku zmiany pole „nazwisko panieńskie" powinno stać się widoczne lub niewidoczne. Do tego celu zostanie wykorzystana właściwość stylu o nazwie visibility. Może ona przyjąć wartości visible albo hidden. Zmiana nastąpi przy zajściu zdarzenia onClick.

8. Dodaj do pliku formularz.htm kod JavaScript odpowiedzialny za zmianę właściwości visibility dla elementu, którego identyfikator jest przekazywany do funkcji jako argument.

...
<body>
<script type=text/javascript>
   function showX(elem)
   {
:document.getElementById(elem).style.visibility=’visible’;
   }
   function hideX(elem)
   {
:document.getElementById(elem).style.visibility=’hidden’;
   }
</script>
...

9. Rozbuduj definicję pola służącego do wprowadzania nazwiska panieńskiego w taki sposób, aby możliwe było jego ukrywanie. Poniżej znajduję się rozwiązanie. Dotychczasowy kod:

...
<input type=text name="f_nazwisko_p">
...

Zastąp przez:

...
<span id="div_nazw" style="visibility:visible;">
  <input type=text name="f_nazwisko_p">
</span>
...

10. Dodaj obsługę zdarzenia polegającego na wybraniu jednej z opcji oznaczających płeć. W zależności od wybranej płci powinno nastąpić ukrycie albo wyświetlenie pola do wprowadzenia nazwiska panieńskiego. Dotychczasowy kod:

...
<input name="f_plec" value "f_k" checked type="radio"/>
...
<input name="f_plec" value="f_m" type="radio"/>
...

Zastąp przez:

...
<input name="f_plec" value "f_k" checked type="radio"
       onClick="showX(’div_nazw’)"/>
...
<input name="f_plec" value="f_m" type="radio"
       onClick="hideX(’div_nazw’)"/>
...

11. Po wykonaniu wszystkich poprzednich kroków plik formularz.htm powinien mieć następującą zawartość:

<html>
<head>
  <title>Javascript</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  <script src="form_check.js"></script>
</head>
<body>

  <script type=text/javascript>
    function showX(elem) {
      document.getElementById(elem).style.visibility=’visible’;
    }
    function hideX(elem) {
          document.getElementById(elem).style.visibility=’hidden’;
    }
  </script>

  <center>

    <form name="formularz1">
      <table border=0>
        <tr><td align="right">Imię</td>
            <td><input type=text name="f_imie"></td></tr>
        <tr><td align="right">Nazwisko</td>
            <td><input type=text name="f_nazwisko"></td></tr>
        <tr><td align="right">Płeć</td>
            <td align="left">
               <input name="f_plec" value "f_k" checked type="radio"
                      onClick="showX(’div_nazw’)"/> kobieta<BR>
               <input name="f_plec" value="f_m" type="radio"
                      onClick="hideX(’div_nazw’)"/>  mężczyzna</td></tr>
        <tr><td align="right">Nazwisko panieńskie</td>
            <td><span id="div_nazw" style="visibility:visible;">
    <input type=text name="f_nazwisko_p"></span>
      </td></tr>
        <tr><td align="right">E-mail</td>
            <td><input type=text name="f_email"></td></tr>
        <tr><td align="right">Kod pocztowy</td>
            <td><input type=text name="f_kod_pocztowy"></td></tr>
        <tr><td align="right">Ulica/Osiedle</td>
            <td><input type=text name="f_ulica"></td></tr>
        <tr><td align="right">Miasto</td>
            <td><input type=text name="f_miasto"></td></tr>
:  <tr><td align="right">Uwagi</td>
            <td><textarea rows="5" cols="15" name="field1"
                 id="idfield1"> </textarea></td></tr>
        <tr><td colspan="2" align="center">
            <input type="button" value="Przeslij"
             onClick="validate(this.form);"></td></tr>
      </table>
    </form>

  </center>

</body>
</html>

12. Uruchom formularz w przeglądarce i sprawdź jego działanie.

Image:AWWW-1st3_6-l03_tresc-1_0_03.png

Image:AWWW-1st3_6-l03_tresc-1_0_04.png


13. Język JavaScript oferuje możliwość wykorzystania mechanizmu wyrażeń regularnych. Mogą one służyć do weryfikacji czy dany napis odpowiada zdefiniowanemu przez programistę wzorcowi. W utworzonym formularzu można znaleźć dwa fragmenty gdzie warto skorzystać z wyrażeń regularnych. Jest to sprawdzanie poprawności kodu pocztowego i adresu mailowego. Zastąp funkcję checkEmail (znajduje się w pliku form_check.js) poniższą definicją i sprawdź działanie formularza.

function checkEmail(st)
{
:var email = /[a-zA-Z_0-9]+@[a-zA-Z_0-9]+\.[a-zA-Z][a-zA-Z]+/
:if (email.test(st))
return true;
else
alert("Podaj właściwy e-mail");
}

14. Kolejnym zadaniem w ćwiczeniu będzie usprawnienie działania formularza przez dodanie weryfikacji kodu pocztowego w „czasie rzeczywistym", tzn. podczas wpisywania tekstu przez użytkownika. W tym celu koniecznie jest wykorzystanie zdarzenia następującego w chwili wpisania nowego znaku w pole kodu pocztowego.

Dotychczasowy kod

<td><input type=text name="f_kod_pocztowy"></td>

zastąp przez:

<td width="200"><input type=text name="f_kod_pocztowy" onKeyUp="check_postal(this);"><b id="kod">Źle</b></td>

Powyższa zmiana wprowadza obsługę zdarzania onKeyUp, które następującego po puszczeniu klawisza. Dodatkowo, obok pola do wprowadzania kodu pocztowego, został dodany tekst z identyfikatorem kod. Ten tekst będzie sygnalizował użytkownikowi, czy wpisywany kod jest poprawny.

15. Konieczne jest zdefiniowanie funkcji sprawdzającej wpisany tekst po każdym puszczeniu klawisza. W odróżnieniu od wcześniej zaimplementowanej funkcji checkPostalCode w pliku form_check.js, dodaj funkcję check_postal do sekcji SCRIPT w pliku formularz.htm. Kod tej funkcji znajduje się poniżej.

function check_postal(elem)
{
:var  postal_code = /^[0-9]{2}-[0-9]{3}$/
:if (postal_code.test(elem.value) )
document.getElementById("kod").innerHTML = "OK";
else
document.getElementById("kod").innerHTML = "Źle";
}


16. Sprawdź działanie ukończonego formularza.

Image:AWWW-1st3_6-l03_tresc-1_0_05.png