JavaScript 2
Transkrypt
JavaScript 2
Ćwiczenie 5 Temat: Zawansowane skrypty JavaScript Cel ćwiczenia: W ramach ćwiczenia student rozszerzy swoją wiedzę o obsłudze formularzy o techniki ich weryfikacji przed wysłaniem do serwera. W celu ułatwienia analizy wypełnionego formularza zastosowane zostaną wyrażenia regularne. Druga część ćwiczenia dotyczy sposobów obsługi zdarzeń czasowych, klawiatury i myszy, które pozwalają uzyskać bardziej interaktywne strony WWW. Weryfikacja zawartości formularza Obiekt formularz posiada zdarzenie onSubmit wywoływane tuż przed jego wysłaniem na serwer (WWW, email) po naciśnięciu przycisku Submit. JavaScript umożliwia nie tylko reakcję na zdarzenie, ale pozwala także w przypadku części zdarzeń blokadę akcji przez nie reprezentowanych. W przypadku zdarzenia onSubmit możemy zablokować za pomocą skryptu wysłanie formularza. Przykład <html> <head> <title>OstrzeŜenie</title> </head> <body> <form action="Oblicz.php" onsubmit="return confirm('Jesteś pewien ?');"> Promień <input name="r" type="text" /> <input type="submit" value="Oblicz" /> </form> </body> </html> W powyższym przykładzie, jeżeli funkcja confirm po decyzji użytkownika zwróci fałsz, to całe zdarzenie zwróci taką wartość i akcja wysłania zostanie zablokowana. W trakcie weryfikacji zawartości formularza do jego elementów możemy odwoływać się przy pomocy metod obiektu document, takich jak: getElementById (jeżeli element posiada atrybut id) lub getElementsByName (jeżeli element posiada atrybut name). Przykład <html> <head> <title>Kontrola</title></head> <script type="text/javascript"> function Sprawdz() { if (isNaN(document.getElementById('promien').value)) { alert(Number(document.getElementById('promien').value)); return false; } if (Number(document.getElementsByName('r')[0].value) < 0) { alert('Promień jest mniejszy 0'); return false; } return true; } Przykład 30 </script> <body> <form id="f1" action="Oblicz.php" onsubmit="return Sprawdz();"> Promień <input id="promien" name="r" type="text" /> <input type="submit" value="Oblicz" /> </form></body></html> Wyrażenia regularne Wyrażenia regularne to wzorce, które opisują łańcuchy symboli. Stanowią doskonały sposób na sprawdzanie i modyfikowanie tekstu. Wzorzec opisujemy za pomocą znaków standardowych i symboli, które w elastyczny sposób opisują fragmenty tekstu. Tabela poniżej zawiera podstawowy zestaw symboli. Symbol Opis Przykład Ciągi zgodne Ciągi niezgodne ^ Początek ciągu ^kot kot, kotka, kotwa pies, pokot $ Koniec ciągu $a Ania, kotka Jan, kot . Jeden dowolny znak .asia Kasia,Basia Ela, Joasia […] Jeden z wymienionych k[oa]t kot,kat kit, koat, kotek Z[0-5] Z2,Z4 Zx,Z9 k[^oa]t kit,ket kat, kot, kotek znaków [^…] Jeden z niewymienionych […|...] Jeden z ciągów [B||Jo|Mich]asia Basia, Michasia Kasia, Ela ? Zero lub jeden znak list?owy lisowy, listowy listy, lisa + Jeden lub wiele znaków [A-Z][a-z]+ Joanna, Kamil anna, 123, kot * Zero lub wiele znaków ko*t kt,kot,koooot lot,gyy {n} Dokładnie n znaków z [0-9]{2}-[0-9]{7} 32-6034111 32-603, 997 [A-Z][a-z]{3,} Janek,Ania Ola, Ela zakresu: tutaj [0-9] {n,} Co najmniej n znaków z zakresu: tutaj [0-9] {n,m} Pomiędzy n i m znaków [0-9]{2,4} 12, 432, 4223 4, 12345 \d Cyfra \d{3} 123, 223 A21, 1234 \D Znak niebędący cyfrą \D+ Asad, ada Sdd1, 123 Przykład 31 \w Litera, cyfra, _ \w{3} A12,123, 1_2 1+3 \W Znak niebędący literą, \W{3} +!!, --- Ala, 123 Jan\sKowalski Jan Kowalski Jan-Kowalski \S+ Jan, 1234, Jaks Jan Kowalski ([A-Z][a-z]+)(-[A- Kowalski, Kowalski- Kow2, Z][a-z]+)* Nowak cyfrą, _ \s Spacja, tabulacja, nowa linia \S Każdy znak niebędący spacją, tabulacją i nl (…) Blok znaków Kowalski—Nowak Ponieważ część znaków ma specjalne znaczenie, to wypadku gdy potrzebujemy ich we wzorcu w ich znaczeniu pierwotnym używamy następujących symboli: \. \* \/ \\ \? \: \^ \+ \\ \= \| W JavaScript istnieją dwa podstawowe sposoby definiowania wyrażeń regularnych. Oba sprowadzają się w rzeczywistości do utworzenia obiektu klasy RegExp. var wyrazenie = /[a-z]+/g var wyrazenie = new RegExp("[a-z]+", "g") Symbol "g” na końcu wyrażenia to jedna z flag oddziałujących na wyszukiwanie wzorców: Flaga Opis g Ignorowania wielkości liter i Wyszukiwanie wszystkich pasujących fragmentów, a nie pierwszego Obiekt klasy RegExp udostępnia bardzo przydatną metodę test, która sprawdza, czy dany ciąg jest zgodny z wyrażeniem regularnym. Jeżeli taka zgodność ma miejsce metoda zwraca prawdę logiczną. Przykład – kontrola zgodności ze wzorcem <html> <head> <title>Kontrola imienia</title> </head> <script type="text/javascript"> function Sprawdz() { var tekst = document.getElementById('imie').value; var wyrazenie = /^[A-Z][a-z]+$/; if (wyrazenie.test(tekst)) Przykład – kontrola zgodności ze wzorcem 32 { return true; } else { alert('Imię niepoprawne'); return false; } } </script> <body> <form id="f1" action="Baza.aspx" onsubmit="return Sprawdz();"> Imię <input id="imie" type="text" /> <input type="submit" value="Dodaj" /> </form> </body> </html> Także obiekty klasy String (ciągi tekstowe) udostępniają metody oparte na wyrażeniach regularnych. Metoda match pozwala wyszukać wystąpienia wzorca w tekście i zwraca ich tablicę. W wypadku braku wystąpień metoda zwraca wartość pustą null. Przykład – wyszukiwanie wzorca <html> <head> <title>Wyszukiwanie</title> </head> <script type="text/javascript"> function Szukaj() { var tekst = document.getElementById('dane').value; var wyrazenie = /\d+/g; wynik = tekst.match(wyrazenie); liczby = ''; for (i = 0; i < wynik.length; i++) liczby += wynik[i] + ' '; alert(liczby); } </script> <body> <textarea id="dane"></textarea> <br /> <input type="button" value="Szukaj liczb" onclick="Szukaj();"/><br /> </body> </html> Przykład – wyszukiwanie wzorca 33 Metoda replace obiektu String umożliwia odszukanie i podmianę fragmentów tekstu zgodnych ze wzorcem. W tekście zastępującym możemy używać symboli $1 $2, które oznaczają odszukane fragmenty wzorca umieszczone w blokach (). <html> <head> <title>Zastępowanie</title> </head> <script type="text/javascript"> function Zastap() { var tekst = document.getElementById('dane').value; var wyrazenie = /(\d+)/g; wynik = tekst.replace(wyrazenie, '<b>$1</b>'); //wytłuszczenie linii wynik = wynik.replace(/\n/g, '<br />'); //rozdział na line document.getElementById('dane2').innerHTML=wynik; } </script> <body> <textarea id="dane" rows="5"></textarea> <br /> <input type="button" value="Zastąp" onclick="Zastap();"/><br /> <div id="dane2" style="background: yellow; width: 200px; height:100px"></div> </body> </html> W przykładzie widzimy (przy rozdziale na linie), że istnieje możliwość zdefiniowania wyrażenia regularnego bezpośrednio w wywołaniu metody. Zadanie 1 1. Przygotuj formularz, jak na rysunku poniżej. Formularz ma być wysyłany metodą get pod adres http://www.polsl.pl po naciśnięciu przycisku „Dodaj do bazy”. Przykład – wyszukiwanie wzorca 34 2. Zablokuj możliwość wysłania formularza, jeżeli użytkownik nie wprowadził poprawnie jednoczłonowego imienia zaczynającego się z dużej litery. Pozwól na spacje przed i za imieniem. 3. Zablokuj możliwość wysłania formularza, jeżeli użytkownik nie wprowadził poprawnie jedno lub wieloczłonowego nazwiska, w którym człony są rozdzielane myślnikiem. Pozwól na spacje przed i za imieniem. 4. Zablokuj możliwość wysłania formularza, jeżeli użytkownik nie wprowadził numeru telefonu w formacie (0xx) xxx-xx-xx (np. (032) 204-32-22) 5. Uzupełnij weryfikację formularza o wyświetlanie okienka informacyjnego i automatyczne przejście do błędnego pola formularza (metoda focus). 6. Rozszerz kontrolę imienia o uwzględnienie płci osoby przyjmując, że imiona żeńskie kończą się literą "a” a męskie nie. Zdarzenia czasowe Obiekt window modelu DOM udostępnia zestaw metod pozwalających zautomatyzować działanie skryptu w oparciu o zdarzenia czasowe. Metoda Opis setTimeout(kod, czas) Zlecenie jednokrotnego wykonania kodu JavaScript po określonej liczbie milisekud. Metoda zwraca identyfikator zlecenia. clearTimeout(id) Anuluwanie zlecenia jednokrotnego wykonania kodu o podanym identyfikatorze setInterval(kod, okres) Zlecenie wielokrotnego wykonania kodu JavaScript co podany okres (w milisekudach). Metoda zwraca identyfikator zlecenia. clearInterval(id) Anuluwanie zlecenia wielokrotnego wykonania kodu o podanym Przykład – wyszukiwanie wzorca 35 identyfikatorze Przykład – wykonanie polecenia JavaScript z opóźnieniem <html> <head> <title>Automatyczne przejście</title> <script type="text/javascript"> var t = setTimeout('navigate("http:\\\\www.onet.pl\")', 5000); </script> </head> <body > Za pięć sekund opuścisz tą stronę, chyba Ŝe naciśniesz ten przycisk <input type="button" value="Zostaję" onclick="clearTimeout(t);" /> </body> </html> Przykład – animacja w JavaScript <html> <head> <title>Animacja</title> <script type="text/javascript"> var t; var x = 200, y = 200; //pozycja piłki var dx = -5, dy = -7; //wektor przesunięcia function Przesun() { x+=dx; y+=dy; if (x<0 || x>200) dx=-dx; //zmiana kierunku poziomego if (y<0 || y>200) dy=-dy; //zmiana kierunku pionowego document.getElementById('pingpong').style.left=x; document.getElementById('pingpong').style.top=y; } </script> </head> <body> <img id="pingpong" src="pingpong.JPG" style="position:absolute; left:200px; top:200px;" /> <input type="button" value="Start" onclick="t=setInterval('Przesun();',50);"/> <input type="button" value="Stop" onclick="clearInterval(t);"/> </body> </html> Przykład – wyszukiwanie wzorca 36 Zadanie 2 1. Opracować skrypt, który zmieni kolor tła strony na niebieski po 5 sekundach od załadowania strony. 2. Oprogramować wyświetlanie aktualnego czasu (raz na sekundę) w elemencie DIV osadzonym bezwzględnie w lewym górny roku strony. Zdarzenia myszy Obiekt document i obiekty elementów HTML obsługują zdarzenia generowane przez mysz. Można je wykorzystać do zaawansowanej obsługi interfejsu użytkownika. Zdarzenie Opis Onclick Zachodzi w chwili kliknięcia myszką Ondblclick Zachodzi w chwili podwójnego kliknięcia myszką onmousedown Zachodzi w chwili naciśnięcia przycisku myszy Onmouseup Zachodzi w chwili zwolnienia przycisku myszy Onmousemove Zachodzi w chwili przesunięcia kursora myszy Onmouseover Zachodzi w chwili najechania kursorem myszy nad obiekt Onmouseout Zachodzi w chwili opuszczenia obiektu przez kursor myszy Poza faktem wystąpienia zdarzenia, często potrzebujemy dodatkowych informacji. Parametry zdarzenia dostarcza nam poprzez swoje właściwości obiekt event. Właściwość Opis clientX, clientY Współrzędne kursora względem naroża okna screenX,screenY Współrzędne kursora względem naroża ekranu Button Numer naciśniętego przycisku Przykład – reakcja na ruch myszy <html> Przykład – reakcja na ruch myszy 37 <head> <title>Obraz z kursorem</title> <script type="text/javascript"> function Przesun() { x=event.clientX; y=event.clientY; document.getElementById('pingpong').style.left=x; document.getElementById('pingpong').style.top=y; } </script> </head> <body onmousemove="Przesun();"> <img id="pingpong" src="pingpong.JPG" style="position:absolute; left:200px; top:200px;" /> </body></html> Zdarzenia klawiatury Zdarzenie Opis onkeydown Zachodzi w chwili naciśnięcia klawisza. Właściwość event.keyCode zawiera kod reprezentujący położenie klawisza onkeyup Zachodzi w chwili zwolnienia klawisza. Właściwość event.keyCode zawiera kod reprezentujący położenie klawisza onkeypress Zachodzi pomiędzy wcześniejszymi zdarzeniami. Właściwość keyCode obiektu ewent zawiera kod ASCII klawisza. Przykład <html> <head> <title>Filtracja znaków</title> <script type="text/javascript"> function Filtr() { var znak = String.fromCharCode(event.keyCode); //dopuść tylko duŜe litery if (znak >= 'A' && znak <= 'Z') return true; else return false; } </script> </head> <body> <input onkeypress="return Filtr();" /> </body> </html> Zadanie 3 Przykład 38 1. Umieścić na stronie element DIV, jak na rysunku. 2. Przygotować funkcję DuzeMenu, która podmieni (wykorzystując właściwości innerHTML) pierwotną zawartość DIV na poniższą. Przetestować działanie funkcji na zdarzeniu click przycisku button. 3. Przygotować funkcje MaleMenu, która przywróci pierwotną zawartość DIV. Przetestować funkcje na drugim przycisku button. 4. Wykorzystując odpowiednie zdarzenia myszy obiektu DIV uzyskać następując funkcjonalność: po najechaniu kursorem napisu MENU pojawia się spis trzech hiperłączy. Po opuszczeniu spisu przez kursor powraca pierwotny wygląd DIV. Przykład 39