Slajdy z wykładu
Transkrypt
Slajdy z wykładu
ra ko wi e IE T I Wykłady — co tydzień, przez pierwsze 7 tygodni semestru I Ćwiczenia laboratoryjne — co dwa tygodnie, przez cały semestr Ocena końcowa obliczana na podstawie ilości punktów za wykonanie: I at yk iw yd zia łu Język JavaScript AG H w K Organizacja przedmiotu Dr inż. Stanisław Polak I Grupa Systemów Komputerowych fo rm http://www.icsr.agh.edu.pl/~polak/ en tó w In I Strona przedmiotu: http://www.icsr.agh.edu.pl/ ~polak/jezyki/js/ 1. HTML5, CSS3 oraz framework Bootstrap 2. JavaScript — typy danych, tworzenie grafik 2D 3. Standard DOM 4. Serwer „Node.js” 5. Framework Express – podstawy 6. Technologia AJAX 7. Biblioteka programistyczna jQuery er ia ły dl a st ud I Zestawu zadań programistycznych, przeznaczonych do wykonania na zajęciach Zestawu zadań domowych (dla chętnych) — termin oddania: następne zajęcia Plan ćwiczeń Dr inż. Stanisław Polak 1 2 M at Dr inż. Stanisław Polak Zagadnienia wstępne Zagadnienia wstępne Model klient-serwer Ogólne zasady tworzenia poprawnych stron WWW I I Formatowanie 6∈ informacja Najprostsze środki I I Serwer Klient Protokół Port Adres IP HTML + CSS HTML + CSS + JavaScript 1 <! DOCTYPE html> 2 <html lang=" pl "> 3 <head> 4 <meta charset=" utf -8 "> 5 <title>Witaj Ś wiecie</ title> 6 <link rel=" stylesheet " href=" main . css " /> 7 </ head> 8 <body> 9 <main> 10 <h1>Witaj Ś wiecie</ h1> 11 <span class=" name ">SP</ span> tutaj by ł . 12 </ main> 13 <f o o t e r>Stanis ł aw Polak</ f o o t e r> 14 </ body> 15 </ html> 1 main , footer { 2 display : block ; 3 background : gray ; 4 padding : 10 px ; 5 margin : 1 px ; 6 } 7 . name {font−family : arial , verdana , sans−serif ;} main.css HTML Dr inż. Stanisław Polak 3 Dr inż. Stanisław Polak 4 Podstawy języka JavaScript Wstęp Ogólna charakterystyka Podstawy języka JavaScript Wstęp JavaScript a Java Ważniejsze różnice I I JavaScript (JS) — skryptowy język programowania, stworzony przez firmę Netscape, początkowo stosowany na stronach internetowych po stronie klienta. ECMAScript — rdzeń dla: I I I I I JavaScript JScript ActionScript TypeScript I Kompilowany przed wykonaniem I Oparty na klasach I Kod niezależny od HTML I Deklaracja typu zmiennej — obligatoryjna dla każdej zmiennej przed jej użyciem I Odwołania do obiektów i funkcji sprawdzane na etapie kompilacji Zastosowania I I I JavaScript Java Strony WWW (po stronie klienta) Samodzielne aplikacje Aplikacje internetowe (po stronie serwera) I Interpretowany na komputerze klienta I Oparty na prototypach I Kod zagnieżdżony w HTML I Deklaracja typu zmiennej — nie występuje I Odwołania do obiektów i funkcji sprawdzane w czasie wykonania skryptu Dr inż. Stanisław Polak 5 Dr inż. Stanisław Polak 6 Podstawy języka JavaScript Wstęp Podstawy języka JavaScript Wstęp Pierwszy skrypt JS 1 <! DOCTYPE html> 2 <html> 3 <head> 4 <title>Pierwszy skrypt JS</ title> 5 </ head> 6 <body> 7 <h1>Pierwszy skrypt JS</ h1> 8 <script> 9 document . write ( " Witaj w dokumencie " ) ; 10 console . log ( " Witaj w konsoli " ) ; 11 </ script> 12 </ body> 13 </ html> Osadzanie kodu JS Rysunek: Wynik wykonania skryptu JS po zakończeniu renderowania strony WWW 1 2 3 4 5 6 7 <!−− <script type=" text / javascript ; version = x . x "> −−> <script type=" text / javascript "> <!−− Tre ś ć s k r y p t u J a v a S c r i p t −−> </ script> <noscript>Twoja przegl ą darka nie obs ł uguje JavaScript !</ noscript> Skrypt wewnętrzny osadzony w HTML 1 <script type=" text / javascript " src=" URL "></ script> 2 <noscript>Twoja przegl ą darka nie posiada interpretera JavaScript lub masz wy ł ą czon ą jego obs ł ug ę !</ noscript> Dokument HTML z treścią skryptu JS Odwołanie do skryptu zewnętrznego Rysunek: Korzystanie z konsoli JS Dr inż. Stanisław Polak 7 Dr inż. Stanisław Polak 8 Wstęp Podstawy języka JavaScript Kolejność wykonywania skryptów K w AG H Wypisze: at yk iw yd zia łu IE T 1. Skrypt 1 Element "img"jest niedostępny ’document.body’=NULL 2. a.js Element "img"jest niedostępny ’document.body’=NULL 3. Skrypt 2 Element "img"jest niedostępny ’document.body’ zawiera elementy: SCRIPT, 4. b.js Element "img"jest niedostępny. ’document.body’ zawiera elementy: SCRIPT, SCRIPT, 5. <Wyświetlenie obrazka ’obrazek.jpg’> 6. Skrypt 3 Element "img"jest dostępny. ’document.body’ zawiera elementy: SCRIPT, SCRIPT, IMG, SCRIPT, 7. c.js Element "img"jest dostępny. ’document.body’ zawiera elementy: SCRIPT, SCRIPT, IMG, SCRIPT, SCRIPT, 8. Skrypt 4 Element "img"jest dostępny ’document.body’ zawiera elementy: SCRIPT, SCRIPT, IMG, SCRIPT, SCRIPT, In fo rm Źródło: http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/ info ( ’<nazwa p l i k u> ’ ) ; dl a 1 st ud 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 Asynchroniczne lub odroczone wykonywanie skryptów zewnętrznych <! DOCTYPE html> <html> <head> <meta h t t p−e q u i v=" Content - Type " content=" text / html ; charset = UTF -8 "> <script> function info ( arg ){ var img = document . g e t E l e m e n t s B y T a g N a m e ( " img " ) ; var nazwy = ’ ’ ; var img_msg = ’\ nElement " img " jest niedost ę pny\n ’ if ( img . length != 0 ) img_msg = ’\ nElement " img " jest dost ę pny\n ’ ; if ( document . body ){ x=document . body . childNodes for ( i =0; i<x . l e n g t h ; i++){ i f ( x [ i ] . nodeType == 1 ) nazwy+=x [ i ] . nodeName+" , " ; } c o n s o l e . l o g ( a r g+img msg+" ’ document . body ’ zawiera elementy : "+ nazwy ) ; } else c o n s o l e . l o g ( a r g+img msg+" ’ document . body ’ = NULL " ) ; } </script> <script type=" text / javascript ">info ( " Skrypt 1 " ) ;</ script> <script type=" text / javascript " src=" a . js "></ script> </ head> <body onLoad=" info ( ’ Skrypt 4 ’) ; "> <script type=" text / javascript ">info ( " Skrypt 2 " ) ;</ script> <script type=" text / javascript " src=" b . js "></ script> <img src=" obrazek . gif "> <script type=" text / javascript ">info ( " Skrypt 3 " ) ;</ script> <script type=" text / javascript " src=" c . js "></ script> </ body> </ html> en tó w 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Wstęp ra ko wi e Podstawy języka JavaScript 9 Dr inż. Stanisław Polak 10 M at Dr inż. Stanisław Polak er ia ły a.js, b.js, c.js Podstawy języka JavaScript Typy danych Podstawy języka JavaScript Definiowanie zmiennych 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Definiowanie stałych var x =42; // a l b o y = 4 2 ; // N i e z a l e c a n e var _y = 4 2 ; var $if =42; var r ó ż a = 4 2 ; var 1 a = 4 2 ; // i d e n t i f i e r s t a r t s i m m e d i a t e l y a f t e r n u m e r i c console . log ( y ) ; // W y p i s z e : 42 console . log ( Y ) ; //Y i s n o t d e f i n e d if =42; // m i s s i n g v a r i a b l e name var y=42 console . log ( typeof ( y ) ) ; // W y p i s z e : number y=" 42 " ; console . log ( typeof ( y ) ) ; // W y p i s z e : s t r i n g Dr inż. Stanisław Polak Typy danych 11 literal 1 2 3 4 5 6 7 8 9 10 11 const PI = 3 . 1 4 1 5 9 2 6 ; console . log ( PI ) ; // W y p i s z e : 3 . 1 4 1 5 9 2 6 console . log ( typeof ( PI ) ) ; // W y p i s z e : number const PI = 3 . 1 4 ; // r e d e c l a r a t i o n o f c o n s t P I PI=" 3.24 " // Pr ó ba n a d p i s a n i a w a r t o ś c i s t a ł e j console . log ( PI ) ; // W y p i s z e : 3 . 1 4 1 5 9 2 6 c z y l i p r ó ba n a d p i s a n i a n i e uda ł a s i ę console . log ( typeof ( PI ) ) ; // W y p i s z e : number var PI = 3 . 1 4 // r e d e c l a r a t i o n o f c o n s t P I var zmienna =1; const zmienna =1; // r e d e c l a r a t i o n o f v a r z m i e n n a Dr inż. Stanisław Polak 12 Podstawy języka JavaScript Typy danych Podstawy języka JavaScript Typy danych Typy danych Typy specjalne Typ „undefined” I Specjalne I I I 1 2 3 4 5 6 7 8 9 10 11 12 Proste I I I I I Typ „null” „null” „undefined” „boolean” „number” „string” „symbol” Złożony I Obiektowy Dr inż. Stanisław Polak Typy danych Typy proste Typy proste i ich obiektowe odpowiedniki console . log ( pusta −1) ; // W y p i s z e : −1 Podstawy języka JavaScript 14 Typy danych Typ „boolean” Typ prosty Obiektowy odpowiednik (Prototyp) boolean number string Boolean Number String 1 console . log ( " 2+2 " ) ; // ”2+2” j e s t t y p u ( p r o s t e g o ) ’ s t r i n g ’ => w y p i s z e : 2+2 2 console . log ( " 2+2 " . length ) ; // N i e j a w n a k o n w e r s j a do t y p u ( p r o t o t y p u ) ’ S t r i n g ’ => wypisze : 3 3 /∗ 4 Powy ż s z a l i n i a j e s t r ównowa ż na : 5 v a r o b i e k t S t r i n g = new S t r i n g (”2+2”) 6 console . log ( obiektString . length ) 7 ∗/ 8 var lancuch = " 2+2 " ; 9 console . log ( lancuch . charAt ( 1 ) ) ; // W y p i s z e : + 10 console . log ( lancuch [ 1 ] ) ; // W y p i s z e : + 11 console . log ( lancuch . charCodeAt ( 1 ) ) ; // W y p i s z e : 43 12 13 var liczba = 1 . 9 8 7 6 5 4 14 console . log ( liczba . toPrecision ( 3 ) ) // N i e j a w n a k o n w e r s j a do t y p u ( p r o t o t y p u ) ’ Number ’ => w y p i s z e : 1 . 9 9 Dr inż. Stanisław Polak var pusta1 = NULL ; //NULL i s n o t d e f i n e d if ( pusta ) console . log ( " true " ) ; else console . log ( " false " ) ; // W y p i s z e : f a l s e Dr inż. Stanisław Polak 13 Podstawy języka JavaScript var pusta=null ; console . log ( typeof ( pusta ) ) ; // W y p i s z e : o b j e c t 1 console . log ( typeof ( abc ) ) ; // W y p i s z e : u n d e f i n e d 2 3 var def ; 4 console . log ( typeof ( def ) ) ; // W y p i s z e : u n d e f i n e d 5 6 function f ( arg ){ 7 console . log ( " arg = "+arg ) 8 } 9 10 var wynik = f ( ) // W y p i s z e : a r g=u n d e f i n e d 11 console . log ( wynik ) // W y p i s z e : u n d e f i n e d 12 13 14 if ( def === undefined ) 15 console . log ( " Ni ez d ef in iowana " ) ; 16 else 17 console . log ( " Zdefiniowana " ) ; 18 // W y p i s z e : N i e z d e f i n i o w a n a 19 20 if ( def ) 21 console . log ( " true " ) ; 22 else 23 console . log ( " false " ) ; 24 // W y p i s z e : f a l s e 25 26 console . log ( def−1) ; // W y p i s z e : NaN 15 1 2 3 4 var martwy=false ; var zonaty=true ; console . log ( typeof ( martwy ) ) ; // W y p i s z e : b o o l e a n zonaty=FALSE ; //FALSE i s n o t d e f i n e d Dr inż. Stanisław Polak 16 Typy proste Podstawy języka JavaScript Typy danych Typy proste Konwersja do typu „boolean” 1 2 3 4 5 6 Podstawy języka JavaScript Typy proste Typ „number” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 console . log ( Boolean ( " abc " ) ) ; // W y p i s z e : t r u e console . log ( Boolean ( " " ) ) ; // W y p i s z e : f a l s e console . log ( Boolean ( 1 0 ) ) ; // W y p i s z e : t r u e console . log ( Boolean ( 0 ) ) ; // W y p i s z e : f a l s e console . log ( Boolean ( null ) ) ; // W y p i s z e : f a l s e console . log ( Boolean ( undefined ) ) ; // W y p i s z e : f a l s e 1 2 3 4 5 6 7 Dr inż. Stanisław Polak 17 Typy danych Typy proste var var var var var var cena = 1 0 . 5 ; ilosc1 = 2 ; ilosc2 = 2 . 0 ; binarna = 0 b101 ; // 0 B101 ; oktalna = 0 o77 ; // 0O77 szesnastkowa = 0 xFF ; // 0XFF console . log ( typeof ( cena ) ) ; // W y p i s z e : number console . log ( typeof ( ilosc1 ) ) ; // W y p i s z e : number console . log ( typeof ( ilosc2 ) ) ; // W y p i s z e : number console . log ( ilosc2 ) ; // W y p i s z e : 2 console . log ( typeof ( binarna ) ) ; // W y p i s z e : number console . log ( binarna ) ; // W y p i s z e : 5 console . log ( typeof ( oktalna ) ) ; // W y p i s z e : number console . log ( oktalna ) ; // W y p i s z e : 63 console . log ( typeof ( szesnastkowa ) ) ; // W y p i s z e : number console . log ( szesnastkowa ) ; // W y p i s z e : 255 var ilosc = −Number . MAX_VALUE console . log ( ilosc ) // W y p i s z e : −1.7976931348623157 e +308 console . log ( isFinite ( ilosc ) ) // W y p i s z e : t r u e ilosc ∗= 2 console . log ( isFinite ( ilosc ) ) // W y p i s z e : f a l s e console . log ( ilosc ) // W y p i s z e : −I n f i n i t y console . log ( Number . N E G A T I VE _ I N F I N I T Y ) ; // W y p i s z e : − Infinity 31 ilosc = Number . M AX _ S A FE _I N TE GE R ; // Math . pow ( 2 , 5 3 ) −1; console . log ( ilosc ) ; // W y p i s z e : 9 0 07 19 9 2 5 47 4 0 9 91 33 console . log ( Number . isSafeInteger ( ilosc ) ) ; 8 // W y p i s z e : t r u e 9 ilosc = Number . MAX_VALUE 34 ilosc1 = Number . M A X_ SA F E_ IN T E G ER + 1 10 console . log ( ilosc ) // W y p i s z e : 1 . 7 9 7 6 9 3 1 3 4 8 6 2 3 1 5 7 e +308 35 console . log ( ilosc1 ) ; // W y p i s z e : 11 console . log ( isFinite ( ilosc ) ) // W y p i s z e : t r u e 9 0 07 19 9 2 5 47 4 0 9 92 12 ilosc ∗= 2 36 console . log ( Number . isSafeInteger ( ilosc1 ) ) ; 13 console . log ( isFinite ( ilosc ) ) // W y p i s z e : f a l s e // W y p i s z e : f a l s e 14 console . log ( ilosc ) // W y p i s z e : I n f i n i t y Dr inż. Stanisław Polak 37 18ilosc2 = Number . M AX _ S A FE _ I N TE GE R + 2 15 console . log ( Number . P O S I T I VE _ I N F I N I T Y ) ; // W y p i s z e : 38 console . log ( ilosc2 ) ; // W y p i s z e : Infinity 9 0 07 19 9 2 5 47 4 0 9 92 16 39 console . log ( ilosc1 == ilosc2 ) ; // W y p i s z e : 17 var cena=Number . MIN_VALUE true , c z y l i okazuje s i ę , ż e ’ i l o s c 1 ’ 18 console . log ( cena ) // W y p i s z e : 5 e−324 o r a z ’ i l o s c 2 ’ s ą s o b i e r ówne ! ! 19 console . log ( isFinite ( cena ) ) // W y p i s z e : t r u e 40 console . log ( Number . isSafeInteger ( ilosc2 ) ) ; proste Podstawy języka JavaScript Typy danych Typy 20 cena = cena / 2 ; // W y p i s z e : f a l s e 21 console . log ( cena ) // W y p i s z e : 0 41 22 console . log ( isFinite ( cena ) ) // W y p i s z e : t r u e 42 ilosc = Number . M IN _ S A FE _I N TE GE R ; //−Number . 23 MAX SAFE INTEGER ; 24 console . log ( Number . NaN ) ; // W y p i s z e : NaN 43 console . log ( ilosc ) ; // W y p i s z e : 25 console . log ( isNaN ( 1 2 3 ) ) ; // W y p i s z e : f a l s e −9007199254740991 26 console . log ( isNaN ( −1.23) ) ; // W y p i s z e : f a l s e 27 console . log ( isNaN (5−2) ) ; // W y p i s z e : f a l s e 28 console . log ( isNaN ( 0 ) ) ; // W y p i s z e : f a l s e 29 console . log ( isNaN ( " Hello " ) ) ; // W y p i s z e : t r u e 30 document . writln ( isNaN ( " 2005/12/12 " ) ) ; // W y p i s z e : t r u e 1 var nazwisko = " Polak " ; 2 var imie = ’ Stanis ł aw ’ ; 3 4 console . log ( typeof ( nazwisko ) ) ; // W y p i s z e : s t r i n g 5 console . log ( typeof ( imie ) ) ; // W y p i s z e : s t r i n g 6 7 console . log ( " Imi ę = $ { imie } Nazwisko = $ { nazwisko } " ) ; // W y p i s z e : I m i ę=${i m i e} N a z w i s k o=${n a z w i s k o} 8 console . log ( ’ Imi ę = $ { imie } Nazwisko = $ { nazwisko } ’ ) ; // W y p i s z e : I m i ę=${i m i e} N a z w i s k o=${n a z w i s k o} 9 10 var a = 11 − " 1 " ; 11 console . log ( a ) ; // W y p i s z e : 10 12 var b = 11 + " 1 " ; 13 console . log ( b ) ; // W y p i s z e : 111 14 15 console . log ( typeof ( a ) ) ; // W y p i s z e : number 16 console . log ( typeof ( b ) ) ; // W y p i s z e : s t r i n g 17 18 nazwisko [ 0 ] = ’W ’ ; 19 console . log ( nazwisko ) ; // W y p i s z e ” P o l a k ” , a n i e ” Wolak ” 20 21 nazwisko = ’W ’ + nazwisko . substr ( 1 ) ; 22 console . log ( nazwisko ) ; // T e r a z w y p i s z e ” Wolak ” 32 st ud en tó w In console . log ( Number ( null ) ) ; // W y p i s z e : 0 console . log ( Number ( undefined ) ) ; // W y p i s z e : NaN console . log ( Number ( false ) ) ; // W y p i s z e : 0 console . log ( Number ( true ) ) ; // W y p i s z e : 1 console . log ( Number ( " 3.14 " ) ) ; // W y p i s z e : 3 . 1 4 console . log ( Number ( " 3.14.1 " ) ) ; // W y p i s z e : NaN console . log ( Number ( " 3 " ) ) ; // W y p i s z e : 3 console . log ( Number ( " 3 a " ) ) ; // W y p i s z e : NaN console . log ( Number ( ’0 x10 ’ ) ) ; // W y p i s z e : 16 console . log ( Number ( ’ ’ ) ) ; // W y p i s z e : 0 console . log ( Number ( ’ \ r \ n \ t ’ ) ; // W y p i s z e : 0 at yk console . log ( parseInt ( " FF - Firefox " ) ) ; // W y p i s z e : NaN console . log ( parseInt ( " FF - Firefox " , 1 6 ) ) ; // W y p i s z e : 255 console . log ( parseInt ( " false " ) ) ; // W y p i s z e : NaN console . log ( parseInt ( " false " , 1 6 ) ) ; // W y p i s z e : 250 − ” f a ” z a m i e n i o n o na l i c z b ę ! fo rm console . log ( parseInt ( " 101 " , 2 ) ) ; // W y p i s z e : 5 console . log ( parseInt ( " FF " ) ) ; // W y p i s z e : NaN console . log ( parseInt ( " FF " , 1 6 ) ) ; // W y p i s z e : 255 iw yd zia łu IE T AG H w console . log ( parseInt ( " 3.14 " ) ) ; // W y p i s z e : 3 console . log ( parseInt ( " 3.94 " ) ) ; // W y p i s z e : 3 console . log ( parseInt ( " 3.94.1 " ) ) ; // W y p i s z e : 3 console . log ( parseInt ( " 3.94 a " ) ) ; // W y p i s z e : 3 console . log ( parseInt ( " a3 .94 " ) ) ; // W y p i s z e : NaN console . log ( parseFloat ( " 3.14 " ) ) ; // W y p i s z e : 3 . 1 4 console . log ( parseFloat ( " 3.14.1 " ) ) ; // W y p i s z e : 3 . 1 4 console . log ( parseFloat ( ’0 x10 ’ ) ) ; // W y p i s z e : 0 console . log ( parseFloat ( ’ ’ ) ) ; // W y p i s z e : NaN console . log ( parseFloat ( ’ \ r \ n \ t ’ ) ) ; // W y p i s z e : NaN Dr inż. Stanisław Polak er 19 at Dr inż. Stanisław Polak ia ł y dl a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Typ „string” K Konwersja do typu „number” ra ko wi e Podstawy języka JavaScript Typy danych 20 Podstawy języka JavaScript Typy danych Typy proste Podstawy języka JavaScript Typ „string” Typ „string” Szablony napisów Sekwencje specjalne Oznakowane (otagowane) 1 2 3 Nieoznakowane 1 2 3 4 5 6 7 var a = 2 ; var napis = ‘ Zmienna ’a ’ ma warto ś ć ${a} , 2+2= ${2+2}\n ‘ console . log ( napis ) ; /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ var napis = ‘ Linia 1 Linia 2 ‘ ; console . log ( napis ) ; 4 5 6 7 8 9 10 11 12 13 14 function znacznik ( napisy , wart1 , wart2 ){ wynik = " Napis 1:\ t \t ’ "+napisy [ 0 ] + " ’\ n " ; wynik += " Surowy napis 1:\ t ’ "+napisy . raw [ 0 ] + " ’\ n " ; wynik += " Warto ś ć 1:\ t \ t "+wart1+" \ n " ; wynik += " Napis 2:\ t \t ’ "+napisy [ 1 ] + " ’\ n " ; wynik += " Surowy napis 2:\ t ’ "+napisy . raw [ 1 ] + " ’\ n " ; wynik += " Warto ś ć 2:\ t \ t "+wart2+" \ n " ; return wynik ; } /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ var a = 2 ; var b = 3 ; napis = znacznik ‘ a+b=\t${a+b}\n, a*b=${a*b } ‘ ; console . log ( napis ) ; Na wyjściu Zmienna ’a’ ma wartość 2, 2+2=4 Linia 1 Linia 2 Dr inż. Stanisław Polak Podstawy języka JavaScript Na wyjściu Napis 1: ’a+b= ’ Surowy napis 1: ’a+b=\t’ Wartość 1: 5 Napis 2: ’ , a*b=’ Surowy napis 2: ’\n, a*b=’ Wartość 2: 6 Konwersja do typu „string” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 \f I \n I \r I \t I \v I \’ I \" I \\ I \xXX I \uXXXX Przykład użycia Dr inż. Stanisław Polak Typy proste Podstawy języka JavaScript 22 Typy danych Typ „symbol” var zywy = true ; console . log ( typeof ( zywy ) ) ; // W y p i s z e : b o o l e a n var lancuch=zywy . toString ( ) ; console . log ( typeof ( lancuch ) ) ; // W y p i s z e : s t r i n g console . log ( lancuch ) ; // W y p i s z e : t r u e var liczba = 0 xFF ; console . log ( 0 xFF . toString ( ) ) ; // W y p i s z e ł a ń c u c h ”255” liczba = 1 1 ; console . log ( liczba . toString ( ) ) ; // W y p i s z e ł a ń c u c h ”11” liczba = 1 1 . 9 ; console . log ( liczba . toString ( ) ) ; // W y p i s z e ł a ń c u c h ” 1 1 . 9 ” var liczba =255; console . log ( liczba . toString ( 2 ) ) ; // W y p i s z e : 11111111 console . log ( liczba . toString ( 4 ) ) ; // W y p i s z e : 3333 console . log ( liczba . toString ( 8 ) ) ; // W y p i s z e : 377 console . log ( liczba . toString ( 1 6 ) ) ; // W y p i s z e : f f console . log ( String ( null ) ) ; // W y p i s z e ł a ń c u c h ” n u l l ” console . log ( String ( undefined ) ) ; // W y p i s z e ł a ń c u c h ” u n d e f i n e d ” console . log ( String ( false ) ) ; // W y p i s z e ł a ń c u c h ” f a l s e ” console . log ( String ( true ) ) ; // W y p i s z e ł a ń c u c h ” t r u e ” console . log ( String ( 2 5 5 ) ) ; // W y p i s z e ł a ń c u c h ”255” console . log ( String ( 3 . 1 4 ) ) ; // W y p i s z e ł a ń c u c h ” 3 . 1 4 ” Dr inż. Stanisław Polak \b I 23 Typy proste 1 console . log ( "a ’\"\ x63 \ ’\ u0105 " ) // W y p i s z e : a ’ ” c ’ ą 21 Typy danych I Typy danych 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 symbol1 = Symbol ( ) ; symbol2 = Symbol ( ) ; console . log ( typeof ( symbol1 ) ) ; // s y m b o l console . log ( symbol1 == symbol2 ) // f a l s e symbol3 = Symbol ( ’ Opis symbolu ’ ) ; symbol4 = Symbol ( ’ Opis symbolu ’ ) ; console . log ( symbol3 ) ; // Symbol ( O p i s s y m b o l u ) console . log ( symbol4 ) ; // Symbol ( O p i s s y m b o l u ) console . log ( symbol3 == symbol4 ) ; // f a l s e symbol5 = Symbol . for ( " symbol3 " ) ; symbol6 = Symbol . for ( " symbol3 " ) ; console . log ( symbol5 ) ; // Symbol ( s y m b o l 3 ) console . log ( symbol6 ) ; // Symbol ( s y m b o l 3 ) console . log ( symbol5 == symbol6 ) ; // t r u e var symbol7 = Symbol . for ( " uid " ) ; console . log ( Symbol . keyFor ( symbol7 ) ) ; // ” u i d ” var symbol8 = Symbol . for ( " uid " ) ; console . log ( Symbol . keyFor ( symbol8 ) ) ; // ” u i d ” var symbol9 = Symbol ( " uid " ) ; console . log ( Symbol . keyFor ( symbol9 ) ) ; // u n d e f i n e d Dr inż. Stanisław Polak 24 Typy proste Podstawy języka JavaScript Typy danych Typ złożony Obiekty Podstawy języka JavaScript Typy danych Przykładowe obiekty wbudowane Hierarchia obiektów wbudowanych Object 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // U t w o r z e n i e i n s t a n c j i t y p u ( wbudowanego ) ’ O b j e c t ’ var obiekt1 = new Object ( ) ; var obiekt2 = {a : 1 , b : 1 0 } ; console . log ( typeof ( obiekt1 ) ) ; // W y p i s z e : o b j e c t console . log ( typeof ( obiekt2 ) ) ; // W y p i s z e : o b j e c t // Dost ę p do w ł a s n o ś c i o b i e k t u console . log ( obiekt1 . constructor ) ; // W y p i s z e : f u n c t i o n O b j e c t ( ) { [ n a t i v e c o d e ] } console . log ( obiekt1 [ ’ constructor ’ ] ) ; // W y p i s z e t o co powy ż e j console . log ( obiekt2 [ ’ constructor ’ ] ) ; // W y p i s z e t o co powy ż e j console . log ( obiekt2 . a ) ; // W y p i s z e : 1 console . log ( obiekt2 [ ’b ’ ] ) ; // W y p i s z e : 10 //Uż y c i e s y m b o l u j a k o w ł a s n o ś c i o b i e k t u a = Symbol ( ) ; var obiekt3 = { [ a ] : 1 , b : 1 0 } console . log ( obiekt3 [ a ] ) ; // 1 console . log ( obiekt3 . a ) ; // undefined console . log ( obiekt3 [ ’a ’ ] ) ; // undefined console . log ( obiekt3 [ ’b ’ ] ) ; // 10 console . log ( obiekt3 . b ) ; // 10 Źródło: http://www.visualtech.ca/javascript/javascript_object_model.php Dr inż. Stanisław Polak Podstawy języka JavaScript 25 Typy danych Dr inż. Stanisław Polak Przykładowe obiekty wbudowane Obiekt „Array” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 var var var var Typy danych Przykładowe obiekty wbudowane Obiekt „Map” tab1 = new Array ( 1 , 2 , 3 ) ; // r ównowa ż ne : v a r t a b 1=A r r a y ( 1 , 2 , 3 ) tab2a = new Array ( 1 0 ) ; // r ównowa ż ne : v a r t a b 2 a = [ ] ; t a b 2 a . l e n g t h =10; tab2b = new Array ( " 10 " ) ; tab3 = [ 4 , ’ abc ’ , 6 ] ; console . log ( tab1 . length ) ; // W y p i s z e : 3 console . log ( tab2a . length ) ; // W y p i s z e : 10 console . log ( tab2b . length ) ; // W y p i s z e : 1 console . log ( tab3 . length ) ; // W y p i s z e : 3 console . log ( tab1 [ 0 ] ) ; // W y p i s z e : 1 console . log ( tab1 . 0 ) ; // m i s s i n g ) a f t e r a rgu men t l i s t console . log ( tab2a [ 0 ] ) ; // W y p i s z e : u n d e f i n e d console . log ( tab2b [ 0 ] ) ; // W y p i s z e : 10 console . log ( tab3 [ 1 ] ) ; // W y p i s z e : abc console . log ( tab3 [ 5 ] ) ; // W y p i s z e : u n d e f i n e d var tab4 = new Array ( new Array ( 1 , null , undefined ) , new Array ( ’A ’ , ’B ’ , ’C ’ ) , new Array ( ’x ’ , ’y ’ , ’z ’ ) ) ; console . log ( tab4 . length ) ; // W y p i s z e : 3 console . log ( tab4 [ 0 ] ) ; // W y p i s z e : 1 , , console . log ( tab4 [ 0 ] [ 1 ] ) ; // W y p i s z e : n u l l var tab1 = new Array ( 1 , 2 , 3 ) ; var tab2 = [ 4 , 5 , 6 ] ; console . log ( tab1 ) ; // W y p i s z e : 1 , 2 3 console . log ( tab1 . reverse ( ) ) ; // W y p i s z e : 3 , 2 , 1 var tab3 = tab1 . concat ( tab2 ) ; console . log ( tab3 ) ; // W y p i s z e : 1 , 2 , 3 , 4 , 5 , 6 console . log ( tab3 . splice ( 1 , 2 ) ) ; // W y p i s z e : 2 , 3 Dr inż. Stanisław Polak Podstawy języka JavaScript 26 27 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 var mapa = new Map ( ) ; pustyObiekt = {}; mapa . set ( " napis " , " Warto ś ć zwi ą zana z napisem " ) ; mapa . set ( 1 , { a : 1 0 } ) ; mapa . set ( pustyObiekt , 1 ) ; console . log ( mapa ) ; //Map { n a p i s : ” Warto ś ć z w i ą z a n a z n a p i s e m ” , 1 : O b j e c t , Object : 1 } console . log ( mapa . get ( 1 ) ) ; // O b j e c t { a : 10 } console . log ( mapa . get ( 2 ) ) ; // u n d e f i n e d console . log ( mapa . get ( " napis " ) ) ; // ” Warto ś ć z w i ą z a n a z n a p i s e m ” console . log ( mapa . get ({}) ) ; // u n d e f i n e d console . log ( mapa . get ( pustyObiekt ) ) ; // 1 console . log ( mapa . size ) ; // 3 mapa . delete ( " napis " ) ; console . log ( mapa . size ) ; // 2 // I t e r o w a n i e h a s z a mapa . forEach ( ( wartosc , klucz , mapa ) => {console . log ( " mapa [ "+klucz+" ]= "+wartosc ) }) ; /∗ W y p i s z e : ”mapa [ 1 ] = [ o b j e c t O b j e c t ] ” ”mapa [ [ o b j e c t O b j e c t ] ] = 1 ” ∗/ // K o n w e r s j a t a b l i c y na h a s z a var kwTab = [ [ " klucz1 " , " Napis " ] , [ " klucz2 " , 5 ] ] ; mapa = new Map ( kwTab ) ; console . log ( mapa ) ; //Map { k l u c z 1 : ” N a p i s ” , k l u c z 2 : 5 } Dr inż. Stanisław Polak 28 Przykładowe obiekty wbudowane Obiekt „ WeakMap” Typy danych Przykładowe obiekty wbudowane Obiekty „Set” oraz „WeakSet” Różnice w stosunku do „Map” I Przechowuje słabe odniesienia do klucza I Kluczami mogą być tylko i wyłącznie obiekty I Klucze nie są przeliczalne I Nie można iterować tego obiektu — patrz linia 11 w AG H IE T at yk iw yd zia łu 7 8 9 10 11 12 fo rm In var zbior = new WeakSet ( ) ; var element = document . querySelector ( ’ body ’ ) ; zbior . add ( element ) ; console . log ( zbior . has ( element ) ) ; // W y p i s z e : t r u e // J e ś l i u s u n i e m y element ’ element ’ , to z o s t a n i e on r ó w n i e ż u s u n i ę t y z n a s z e j Weakset element . parentNode . removeChild ( element ) ; // Usu ń l o k a l n e odwo ł a n i e element = null ; console . log ( zbior . has ( element ) ) ; // W y p i s z e : false 30 er Dr inż. Stanisław Polak 29 M at Dr inż. Stanisław Polak ia ły 12 13 // J e ś l i u s u n i e m y j e d e n z e l e m e n t ów , w tym p r z y p a d k u e l e m e n t 2 , z o s t a n i e on r ó w n i e ż u s u n i ę t y z n a s z e j Weakmap 14 element2 . parentNode . removeChild ( element2 ) ; 15 16 // Usu ń l o k a l n e odwo ł a n i e 17 element2 = null ; 18 19 console . log ( mapa . get ( element2 ) ) ; // W y p i s z e : u n d e f i n e d 1 2 3 4 5 6 en tó w console . log ( mapa . size ) ; // W y p i s z e : u n d e f i n e d //mapa . f o r E a c h ( ( w a r t o s c , k l u c z , mapa ) => { c o n s o l e . l o g ( ” mapa[”+ k l u c z +”]=”+ w a r t o s c ) }) ; 16 17 18 19 20 21 22 23 24 25 26 27 WeakSet ud // Prze chowujemy dwa o b i e k t y w naszym Weakmap mapa . set ( element1 , ’ window ’ ) ; mapa . set ( element2 , ’ myelement ’ ) ; 8 9 10 11 12 13 14 15 var zbior = new Set ( ) ; pustyObiekt = {}; zbior . add ( " napis " ) ; zbior . add ( " napis " ) ; zbior . add ({a : 1 0 } ) ; console . log ( zbior . size ) ; // 2 zbior . forEach ( ( wartosc , klucz , zbior ) => {console . log ( " zbior [ "+klucz+" ]= "+wartosc ) }) ; /∗ Wypisze : ” z b i o r [ n a p i s ]= n a p i s ” ” z b i o r [ [ object Object ]]=[ object Object ]” ∗/ zbior . delete ( " napis " ) console . log ( zbior . size ) ; // 1 zbior . forEach ( ( wartosc , klucz , zbior ) => {console . log ( " zbior [ "+klucz+" ]= "+wartosc ) }) ; /∗ Wypisze : ” z b i o r [ [ object Object ]]=[ object Object ]” ∗/ /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ zbior = new WeakSet ( ) ; obj1 = {}; obj2 = obj ; zbior . add ( obj1 ) ; zbior . add ( obj2 ) ; console . log ( zbior . has ( obj1 ) ) ; console . log ( zbior . has ( obj2 ) ) ; st //Ź r ód ł o : h t t p : / / i l i k e k i l l n e r d s . com /2015/02/ what−a r e−weakmaps−i n−e s 6/−−> var mapa = new WeakMap ( ) ; var element1 = window ; var element2 = document . querySelector ( ’ body ’ ) ; K Set 1 2 3 4 5 6 7 a 1 2 3 4 5 6 7 8 9 10 11 Podstawy języka JavaScript ra ko wi e Typy danych dl Podstawy języka JavaScript Podstawy języka JavaScript Typy danych Przykładowe obiekty wbudowane Obiekt „RegExp” Podstawy języka JavaScript Typy danych Przykładowe obiekty wbudowane Obiekt „Function” 1 function sprawdz ( numer ) { 2 var re = /\d{7}/g ; // ’ g ’ − zwr ó ć w s z y s t k i e p a s u j ą c e f r a g m e n t y , a n i e t y l k o pierwszy 3 // l u b 4 var re=new RegExp ( " \\ d {7} " , " g " ) ; 5 6 if ( re . test ( numer ) ) 7 console . log ( " Prawid ł owy numer telefonu " ) ; 8 else 9 console . log ( " Numer telefonu powinien sk ł ada ć si ę z 7 - u cyfr " ) ; 10 } 11 12 var numer1=" 1234567 " ; 13 var numer2=" 12 -34 " ; 14 15 sprawdz ( numer1 ) ; // W y p i s z e : P r a w i d ł owy numer t e l e f o n u 16 sprawdz ( numer2 ) ; // W y p i s z e : Numer t e l e f o n u p o w i n i e n s k ł ada ć s i ę z 7−u c y f r 1 2 3 4 5 6 var dodawacz = new Function ( " a " , " b " , " return a + b " ) ; var wynik = dodawacz ( 1 , 2 ) ; console . log ( wynik ) ; // W y p i s z e : 3 console . log ( dodawacz . length ) ; // W y p i s z e : 2 var obj = {x : 1 , y : 2 } ; dodawacz = new Function ( " komunikat " , " console . log ( komunikat + ’ ’) ; return this . x + this . y " ) ; 7 console . log ( dodawacz . call ( obj ) ) ; // W y p i s z e : u n d e f i n e d 3 8 console . log ( dodawacz . call ( obj , ’ Wartosc = ’ ) ) ; // W y p i s z e : Wartosc=3 Sprawdzanie poprawności formatu numeru telefonu Dr inż. Stanisław Polak 31 Dr inż. Stanisław Polak 32 Podstawy języka JavaScript Typy danych Przykładowe obiekty wbudowane Obiekt „Math” Podstawy języka JavaScript Typy danych Przykładowe obiekty wbudowane Obiekt „Date” 1 ... 2 <canvas id=" canvas " width=" 400 " height=" 100 "> 3 Twoja przegl ą darka nie obs ł uguje elementu " canvas " 4 </canvas> 5 6 <script type=" text / javascript "> 7 var canvas = document . getElementById ( " canvas " ) ; 8 if ( canvas . getContext ) { 9 var ctx = canvas . getContext ( ’2 d ’ ) ; 10 var ox = 0 , oy = 5 0 ; 11 var t_min = 0 , t_max = 10∗Math . PI ; 12 var scale = 2 0 , step = 2 0 0 , inc = t_max / step ; 13 14 ctx . beginPath ( ) ; 15 for ( var t=t_min ; t<=t_max ; t+=inc ) { 16 y = scale ∗ Math . sin ( t ) ; 17 x = ( t / t_max ) ∗ canvas . width ; 18 ctx . lineTo ( ox+x , oy−y ) ; 19 } 20 ctx . stroke ( ) ; 21 </script> 22 . . . 1 function JSClock ( ) { 2 var time = new Date ( ) 3 var hour = time . getHours ( ) 4 var minute = time . getMinutes ( ) 5 var second = time . getSeconds ( ) 6 var temp = " " + ( ( hour > 1 2 ) ? hour − 12 : hour ) 7 if ( hour == 0 ) 8 temp = " 12 " ; 9 temp += ( ( minute < 1 0 ) ? " :0 " : " : " ) + minute 10 temp += ( ( second < 1 0 ) ? " :0 " : " : " ) + second 11 temp += ( hour >= 1 2 ) ? " P . M . " : " A . M . " 12 return temp 13 } 14 document . write ( JSClock ( ) ) ; // W y p i s z e : 2 : 2 1 : 4 7 P .M. Wypisanie aktualnego czasu w formacie 12-godzinnym Rysowanie wykresu funkcji y = sin(x), dla x ∈ [0, 10π] Dr inż. Stanisław Polak Podstawy języka JavaScript 33 Typy danych Dr inż. Stanisław Polak Przykładowe obiekty wbudowane Obiekt „navigator” Podstawy języka JavaScript 34 Typy danych Przykładowe obiekty wbudowane Obiekt „window” Metody prompt() oraz alert() 1 // Zak ł adamy , ż e ’ n a v i g a t o r . u s e r A g e n t ’ z a w i e r a n a p i s ” M o z i l l a / 4 . 0 ( c o m p a t i b l e ; MSIE 7 . 0 ; Windows NT 5 . 1 ; . NET CLR 2 . 0 . 5 0 7 2 7 ) ” 2 3 if ( / MSIE (\ d+\.\d+) ; / . test ( navigator . userAgent ) ) { // s p r a w d ź c z y p r z e g l ą d a r k a t o MSIE x . x ; 4 var ieversion=new Number ( RegExp . $1 ) // $1 z a w i e r a numer w e r s j i , t u : 7 . 0 5 if ( ieversion >=8) 6 document . write ( " You ’ re using IE8 or above " ) 7 else if ( ieversion >=7) 8 document . write ( " You ’ re using IE7 . x " ) 9 else if ( ieversion >=6) 10 document . write ( " You ’ re using IE6 . x " ) 11 else if ( ieversion >=5) 12 document . write ( " You ’ re using IE5 . x " ) 13 } 14 else 15 document . write ( " n / a " ) Rozpoznawanie wersji przeglądarki IE Dr inż. Stanisław Polak 35 1 <html> 2 <head> 3 <meta http−equiv=" Content - Type " content=" text / html ; charset = UTF -8 "> 4 <title>Przyk ł ad</title> 5 <script> 6 function w c z y t a j I w y s w i e t l I m i e ( ) { 7 var imie=window . prompt ( ’ Podaj swoje imi ę ’ , ’ ’ ) ; 8 window . alert ( " Witaj "+imie ) ; 9 } 10 </script> 11 </head> 12 <body> 13 <form> 14 <button type=" button " onClick=" w c z y t a j I w y s w i e t l I m i e () ; ">Wy ś wietl alert</ button><br> 15 </form> 16 </body> 17 </html> Otwieranie okna wprowadzania / wyprowadzania danych Dr inż. Stanisław Polak 36 Podstawy języka JavaScript Typy danych Przykładowe obiekty wbudowane Podstawy języka JavaScript Typy danych Obiekt „window” Obiekt „window” Metody setTimeout() oraz clearTimeout() Metody setInterval() oraz clearInterval() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <html> <head> <meta http−equiv=" Content - Type " content=" text / html ; charset = UTF -8 "> <title>Przyk ł ad</title> <script> function opozn ionyAlert ( time ) { timeoutID = window . setTimeout ( wyswietl , 2 0 0 0 ) ; } function wyswietl ( ) { window . alert ( " Witaj ś wiecie ! " ) ; // t i m e o u t I D = window . setTimeout ( w y s w i e t l , 2 0 0 0 ) ; } function z a t r z y m aj W yk o n a ni e ( ) { window . clearTimeout ( timeoutID ) ; } </script> </head> <body> <form> <button type=" button " onClick=" opoznionyAlert () ; ">Wy ś wietl alert</button><br> <button type=" button " onClick=" z a t rz ym a jW y ko n a n ie () ; ">Anuluj</button> </form> </body> </html> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <html> <head> <meta http−equiv=" Content - Type " content=" text / html ; charset = UTF -8 "> <title>Przyk ł ad</title> <script> function u r u c h o m C y k l i c z n e W y k o n a n i e ( ) { timeoutID = window . setInterval ( wyswietl , 1 0 0 0 ) ; } function wyswietl ( ) { console . log ( " Witaj ś wiecie ! " ) ; } function z a t r z y m a j C y k l i c z n e W y k o n a n i e ( ) { window . clearInterval ( timeoutID ) ; } </script> </head> <body> <form> <button type=" button " onClick=" u r u c h o m C y k l i c z n e W y k o n a n i e () ">Uruchom</button><br> <button type=" button " onClick=" z a t r z y m a j C y k l i c z n e W y k o n a n i e () ; ">Anuluj</button> </form> </body> </html> Co sekundę wypisywany jest komunikat na konsoli Po upływie 2 sekund wyświetla się okienko alertu Dr inż. Stanisław Polak 37 Typy danych Dr inż. Stanisław Polak Przykładowe obiekty wbudowane 38 Podstawy języka JavaScript Typy danych Przykładowe obiekty wbudowane Obiekt „window” ra ko wi e Podstawy języka JavaScript Przykładowe obiekty wbudowane Obiekt „document” w AG H T IE łu yd zia iw at yk fo rm In tó w en function z a t r z y m a j C y k l i c z n e W y k o n a n i e ( ) { window . cancelAnimationFrame ( requestID ) ; } </script> </head> <body> <form> <button type=" button " onClick=" u r u c h o m C y k l i c z n e W y k o n a n i e () ">Uruchom</button><br> <button type=" button " onClick=" z a t r z y m a j C y k l i c z n e W y k o n a n i e () ; ">Anuluj</button> </form> </body> </html> ud function wyswietl ( ) { console . log ( " Witaj ś wiecie ! " ) ; requestID=window . requestAnimationFrame ( wyswietl ) ; } 1 <html> 2 <head> 3 <meta http−equiv=" Content - Type " content= " text / html ; charset = UTF -8 "> 4 <title>Przyk ł ad</title> 5 </head> 6 <body> 7 Witaj 8 <script type=" text / javascript "> 9 var noweOkno=window . open ( ’ ’ , ’ ’ , ’ toolbar = no , scrollbars = no , width =200 , height =150 ’ ) ; 10 noweOkno . document . open ( " text / html " , " replace " ) ; 11 noweOkno . document . writeln ( " Witaj ś wiecie ! " ); 12 noweOkno . document . write ( " To jest test . " ) ; 13 noweOkno . document . close ( ) ; 14 document . write ( " w bie ż ą cym oknie . " ) ; 15 16 </script> 17 </body> 18 </html> Wypisanie tekstu w nowym oknie st <html> <head> <meta http−equiv=" Content - Type " content=" text / html ; charset = UTF -8 "> <title>Przyk ł ad</title> <script> function u r u c h o m C y k l i c z n e W y k o n a n i e ( ) { requestID=window . requestAnimationFrame ( wyswietl ) ; } dl a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 K Metody requestAnimationFrame() oraz cancelAnimationFrame() Dr inż. Stanisław Polak er 39 at Dr inż. Stanisław Polak ia ł y Cyklicznie, podczas odświeżania ekranu, wypisywany jest komunikat 40 Podstawy języka JavaScript Typy danych Przykładowe obiekty wbudowane Obiekt„form” Podstawy języka JavaScript Typy danych Przykładowe obiekty wbudowane Obiekt „Image” 1 <html> 2 <head> 3 <meta http−equiv=" Content - Type " content=" text / html ; charset = UTF -8 "> 4 <title> document . forms example</title> 5 <script type=" text / javascript "> 6 function sprawdz ( ) { 7 var form = document . forms [ 0 ] ; 8 // v a r form = document . f o r m s . form1 ; 9 // v a r form = document . f o r m s [ ’ form1 ’ ] ; 10 var element = form . elements [ 0 ] ; 11 // v a r element = form . e l e m e n t s . w i e k ; 12 // v a r element = form . e l e m e n t s [ ’ wiek ’ ] ; 13 if ( element . value == " " ){ 14 window . alert ( " Pole wiek musi zosta ć wype ł nione " ) ; 15 return false ; 16 } 17 else 18 return true ; 19 } 20 </script> 21 </head> 22 <body> 23 <!−− <form . . . onSubmit=" return false ; "> −−> 24 <form id=" form1 " action=" " onSubmit=" return sprawdz () ; "> 25 <input name=’ wiek ’ type=’ text ’> 26 <input type=’ submit ’> 27 </form> 28 </body> 29 </html> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <html> <head> <script language = " JavaScript "> function preloader ( ) { duzyObrazek = new Image ( ) ; duzyObrazek . src = " duzyObrazek . jpg " ; } </script> </head> <body onLoad=" javascript : preloader () "> <a href=" # " onMouseOver=" javascript : document .images[0]. src = ’ duzyObrazek . jpg ’ "> <!−− lub tak : <a href=" # " onMouseOver=" javascript : document . img01 . src = ’ duzyObrazek . jpg ’ "> −−> <img name=" img01 " src=" innyObrazek . jpg "></a> </body> </html> Wstępne ładowanie dużego obrazka Wstrzymanie wysyłki formularza Dr inż. Stanisław Polak Podstawy języka JavaScript Typy danych Przykładowe obiekty wbudowane Obiekt „location” 1 2 3 4 5 6 Dr inż. Stanisław Polak 41 Podstawy języka JavaScript 42 Typy danych Przykładowe obiekty wbudowane Obiekt „history” <script type=" text / javascript "> if ( window . location . protocol == " http : " ) { var resztaUrl = window . location . href . substr ( 5 ) ; location . href = " https : " + resztaUrl ; } </script> 1 history . back ( ) ; // r ównowa ż ne k l i k n i ę c i u p r z y c i s k u 2 history . go (−1) ; // r ównowa ż ne h i s t o r y . b ac k ( ) ; Przekierowanie do bezpiecznego protokołu HTTPS Dr inż. Stanisław Polak 43 Dr inż. Stanisław Polak 44 ’ Wstecz ’ Podstawy języka JavaScript Typy danych Przykładowe obiekty wbudowane Obiekt „screen” Podstawy języka JavaScript Operatory Operatory „odziedziczone” z języka Java Dokładnie takie same jak w Java 1 if ( screen . pixelDepth < 8 ) { 2 // u ż y c i e , , n i s k o −k o l o r o w e j ’ ’ w e r s j i s t r o n y 3 } else { 4 // u ż y c i e , , pe ł no−k o l o r o w e j ’ ’ w e r s j i s t r o n y 5 } Dr inż. Stanisław Polak Podstawy języka JavaScript Przecinkowy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 I Warunkowy (?:) I Bitowe (&, |, ^, ~, <<, >>, >>>) I Logiczne (&&, ||, !) I Łańcuchowy (+) I Przypisania (=, *=,/=, %=, +=, -=, <<=, >>=, >>>=, &=, ^=, |=) I Typu (instanceof) I new oraz this Prawie takie same jak w Java I Specjalne Porównania — dodatkowe: === oraz !== 1 document . write ( true == 1 ) ; // W y p i s z e : t r u e , gdy ż ’ t r u e ’ j e s t k o n w e r t o w a n e do 1 a n a s t ę p n i e p o r ó wnywane 2 document . write ( " 1 " == 1 ) ; // W y p i s z e : t r u e , gdy ż 1 j e s t k o n w e r t o w a n e do ”1” a n a s t ę p n i e p o r ó wnywane 3 document . write ( " 1 " === 1 ) ; // W y p i s z e : f a l s e 4 document . write ( " 1 " !== 1 ) ; // W y p i s z e : t r u e 5 document . write ( 1 === 1 ) ; // W y p i s z e : t r u e Dodatkowe operatory porównania 46 Podstawy języka JavaScript Operatory Operator in a=1 , b =2; document . write ( a ) ; // W y p i s z e : 1 document . write ( b ) ; // W y p i s z e : 2 for ( var i = 0 , j = 9 ; i <= 9 ; i++, j−−) document . writeln ( " a [ " + i + " ][ " + j + " ] " ) ; /∗ W y p i s z e : a[0][9] a[1][8] a[2][7] a[3][6] a[4][5] a[5][4] a[6][3] a[7][2] a[8][1] a[9][0] ∗/ Dr inż. Stanisław Polak Arytmetyczne (+, -, *, /, ++, --, %) Dr inż. Stanisław Polak 45 Operatory I 47 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 var drzewa = new Array ( " sekwoja " , " cedr " , " d ą b " , " klon " ) ; 0 in drzewa ; // z w r a c a t r u e 3 in drzewa ; // z w r a c a t r u e 6 in drzewa ; // z w r a c a f a l s e " klon " in drzewa ; // z w r a c a f a l s e ( n a l e ż y poda ć numer i n d e k s u , // a n i e w a r t o ś ć z n a j d u j ą c ą s i ę po podanym i n d e k s e m ) " length " in drzewa ; // z w r a c a t r u e ( l e n g t h j e s t w ł a s n o ś c i ą A r r a y ) // O b i e k t y p r e d e f i n i o w a n e " PI " in Math ; // z w r a c a t r u e var mojString = new String ( " koral " ) ; " length " in mojString ; // z w r a c a t r u e // O b i e k t y var auto = " marka " in " model " in Dr inż. Stanisław Polak uż ytkownika {marka : " Honda " , model : " Accord " , rok : 1 9 9 8 } ; auto ; // z w r a c a t r u e auto ; // z w r a c a t r u e 48 Specjalne Specjalne var drzewa = new Array ( " sekwoja " , " cedr " , " d ą b " , " klon " ) ; document . write ( drzewa . length ) ; // W y p i s z e : 4 document . write ( drzewa [ 2 ] ) ; // W y p i s z e : d ą b delete drzewa [ 2 ] ; document . write ( drzewa . length ) ; // W y p i s z e : 4 document . write ( drzewa [ 2 ] ) ; // W y p i s z e : u n d e f i n e d K w AG H IE T mojaFun = new Function ( " 5 + 2 " ) ; ksztalt = " okr ą g ł y " ; rozmiar = 1 ; dzis = new Date ( ) ; typeof mojaFun ; // z w r a c a ” f u n c t i o n ” typeof ( ksztalt ) ; // z w r a c a ” s t r i n g ” typeof rozmiar ; // z w r a c a ” number ” typeof dzis ; // z w r a c a ” o b j e c t ” typeof nieIstnieje ; // z w r a c a ” u n d e f i n e d ” typeof true ; // z w r a c a ” b o o l e a n ” typeof null ; // z w r a c a ” o b j e c t ” typeof 6 2 ; // z w r a c a ” number ” typeof ’ Hello world ’ ; // z w r a c a ” s t r i n g ” typeof Math ; // z w r a c a ” o b j e c t ” typeof Array ; // z w r a c a ” f u n c t i o n ” drzewa [ 3 ] = undefined ; if ( 2 in drzewa ) document . write ( " Element o indeksie 2 istnieje w tablicy " ) ; if ( 3 in drzewa ) document . write ( " Element o indeksie 3 istnieje w tablicy " ) ; // W y p i s z e : E l e m e n t o i n d e k s i e 3 i s t n i e j e w t a b l i c y Dr inż. Stanisław Polak 49 50 M at Dr inż. Stanisław Polak er ia ły dl a 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var var var var at yk iw yd zia łu 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 en tó w 7 8 x = 42; var y = 4 3 ; obj = new Number ( ) ; obj . h = 4 ; delete x ; // z w r a c a t r u e (moż na u sun ą ć z mien n ą j e ż e l i z d e f i n i o w a n o j ą niejawnie ) delete y ; // z w r a c a f a l s e ( n i e moż na us un ą ć z m i e n n e j j e ż e l i z d e f i n i o w a n o j ą przy uż y c i u ’ var ’ ) delete Math . PI ; // z w r a c a f a l s e ( n i e moż na us un ą ć p r e d e f i n i o w a n y c h w ł a s n o ś c i ) delete obj . h ; // z w r a c a t r u e (moż na u su n ą ć w ł a ś c i w o ś c i z d e f i n i o w a n e p r z e z u ż ytkownika ) delete obj ; // z w r a c a t r u e (moż na u su n ą ć z mien n ą j e ż e l i z d e f i n i o w a n o j ą niejawnie ) ud 6 Podstawy języka JavaScript Operatory Operator void Specjalne Podstawy języka JavaScript Instrukcje Instrukcje „odziedziczone” z języka Java 1 <A HREF=" javascript : void (0) ">Kliknij tutaj , aby nic si ę nie wykona ł o</ A> 2 <A HREF=" javascript : void ( document . form . submit () ) ">Kliknij tutaj aby formularz zosta ł zatwierdzony</ A> Dr inż. Stanisław Polak Specjalne Operator typeof st 1 2 3 4 5 Operatory fo rm Operator delete Podstawy języka JavaScript ra ko wi e Operatory In Podstawy języka JavaScript 51 I Blokowa ({}) I Warunkowa (if) I break oraz continue I Wyboru (switch) I Pętle (while, do oraz for) Dr inż. Stanisław Polak 52 Podstawy języka JavaScript Instrukcje Instrukcja for ... in 1 var auto = {marka : " Ferrari " , kolor : " czerwony " , ilosc_drzwi : 2 } ; 2 for ( licznik in auto ) 3 console . log ( auto [ licznik ] ) ; Podstawy języka JavaScript Instrukcje Instrukcja for ... of 1 var tab = new Array ( 1 , 2 , 3 ) ; 2 tab . nowaWlasnosc = 1 2 3 ; 3 for ( licznik in tab ) 4 console . log ( " tab [ "+licznik+" ]= "+tab [ licznik ] ) ; Iterowanie tablicy — niewskazane Iterowanie obiektu Na wyjściu Ferrari czerwony 2 Dr inż. Stanisław Polak Podstawy języka JavaScript Na wyjściu tab[0]=1 tab[1]=2 tab[2]=3 tab[nowaWlasnosc]=123 53 Instrukcje Instrukcja with 1 var tab = new Array ( ’a ’ , 2 , 3 ) ; 2 tab . nowaWlasnosc = ’b ’ ; 3 for ( licznik of tab ) 4 console . log ( licznik ) ; 1 2 3 4 5 6 7 8 var mapa = new Map ( ) ; pustyObiekt = {}; mapa . set ( " napis " , " co ś " ) ; mapa . set ( 1 , { a : 1 0 } ) ; mapa . set ( pustyObiekt , 1 ) ; for ( var [ klucz , wartosc ] of mapa ) { console . log ( klucz + " = " + wartosc ) ; } Na wyjściu Na wyjściu a 2 3 "napis = coś" "1 = [object Object]" "[object Object] = 1" Dr inż. Stanisław Polak Podstawy języka JavaScript 54 Instrukcje Obsługa wyjątków Instrukcje throw, try, catch oraz finally 1 2 3 4 5 6 7 8 var auto = {marka : " Ferrari " , kolor : " czerwony " , ilosc_drzwi : 2 } ; marka = " Fiat " ; with ( auto ) { console . log ( marka ) ; // W y p i s z e : F e r r a r i console . log ( kolor ) ; // W y p i s z e : c z e r w o n y console . log ( ilosc_drzwi ) ; // W y p i s z e : 2 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // U t w o r z e n i e o b i e k t u r e p r e z e n t u j ą c e g o w y j ą t e k function Wyjatek ( komunikat ) { this . komunikat=komunikat ; this . nazwa=" Ujemna " ; } try{ var wiek = −1; if ( wiek <0){ var wyjatek=new Wyjatek ( " Wiek nie mo ż e by ć liczb ą ujemn ą " ) ; throw wyjatek ; } console . log ( " To ju ż si ę nie wypisze " ) ; } catch ( e if e . nazwa ==" Ujemna " ) { console . log ( e . komunikat ) ; } catch ( e ) {/∗ o b s ł uga w y j ą t k ów , k t ó r y c h wcze ś n i e j n i e p r z e c h w y c o n o ∗/} finally{/∗ i n s t r u k c j e , k t ó r e maj ą by ć z a w s z e wykonane ∗/} Na wyjściu Wiek nie może być liczbą ujemną Dr inż. Stanisław Polak 55 Dr inż. Stanisław Polak 56 Podstawy języka JavaScript Funkcje Funkcje I I Podstawy języka JavaScript Funkcje Funkcje anonimowe Definiowanie (inaczej niż w Java) — za pomocą słowa kluczowego function; wywoływanie funkcji oraz zwracanie wartości przez funkcję — tak samo jak w Java Pozwalają definiować obiekty 1 function mnoz ( a , b=1){ 2 var c = a ∗ b ; 3 a = 0; 4 b = 0; 5 return c ; 6 } 7 function f ( ) { return [ 1 , 2 , 3 ] } 8 9 a = 2; 10 b = 2 ; 11 var wynik = mnoz ( a , b ) ; 12 console . log ( wynik ) ; // w y p i s z e 4 13 var wynik = mnoz ( a ) ; 14 console . log ( wynik ) ; // w y p i s z e 2 15 16 var x , y , z ; 17 [ x , y , z ] = f ( ) ; // Zwró c e n i e w i e l u w a r t o ś c i 18 [ x , y , z ] = ( function f ( ) { return [ 1 , 2 , 3 ] }) ( ) ; // J e d n o c z e s n e d e f i n i o w a n i e i wywo ł a n i e funkcji 19 console . log ( x ) ; // W y p i s z e : 1 20 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 21 const sta ł a = 1 ; 22 var zmienna = 2 ; 23 function sta ł a ( ){} // R e d e c l a r a t i o n o f c o n s t s t a ł a 24 function zmienna ( ){} 25 zmienna ( ) ; // z m i e n n a i s n o t a f u n c t i o n 1 function zmien ( x , obiekt1 , obiekt2 ){ 2 x = 2; 3 obiekt1 . marka = " Fiat " ; 4 obiekt2 = {marka : " Skoda " }; 5 } 6 7 var auto1 = {marka : " Ferrari " }; 8 var auto2 = {marka : " Ferrari " }; 9 var zmienna = 1 ; 10 console . log ( zmienna ) ; // W y p i s z e : 1 11 console . log ( auto1 . marka ) ; // W y p i s z e : F e r r a r i 12 console . log ( auto2 . marka ) ; // W y p i s z e : F e r r a r i 13 zmien ( zmienna , auto1 , auto2 ) ; 14 console . log ( zmienna ) ; // W y p i s z e : 1 15 console . log ( auto1 . marka ) ; // W y p i s z e : F i a t 16 console . log ( auto2 . marka ) ; // W y p i s z e : F e r r a r i Przekazywanie typów prostych oraz złożonych function Osoba ( ) { // K o n s t r u k t o r Osoba ( ) d e f i n i u j e ’ t h i s ’ j a k o i n s t a n c j ę samego s i e b i e this . wiek = 0 ; this . placa = 0 ; setInterval ( function ( ) { // T u t a j ’ t h i s ’ ⇐⇒ o b i e k t ’ window ’ , c z y l i j e s t r ó ż ne od ’ t h i s ’ zdefiniowanego w konstruktorze Osoba this . wiek++; console . log ( " Wiek = "+this . wiek ) ; }, 1000) ; setInterval ( ( ) => { this . placa++;// T u t a j ’ t h i s ’ j e s t o b i e k t e m Osoba console . log ( " P ł aca = "+this . placa ) ; }, 1000) ; } var osoba = new Osoba ( ) ; 1 2 1 // F u n k c j a p r o c e d u r a l n a 2 function hello1 ( kto ) { 3 return ’ Hello ’+kto ; 4 } 5 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 6 console . log ( hello1 ( ’ world ’ ) ) ; // W y p i s z e : ” H e l l o w o r l d ” 7 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 8 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 9 // F u n k c j a j a k o z m i e n n a 10 var hello2 = function ( kto ) {return ’ Hello ’+kto }; 11 // l u b 12 var hello2 = ( kto ) => {return ’ Hello ’+kto }; 13 // l u b 14 var hello2 = ( kto ) => ’ Hello ’+kto ; 15 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 16 var hello3 = function ( ) { 17 console . log ( ’ Witaj ’ ) ; 18 console . log ( ’Ś wiecie ’ ) ; 19 } 20 // l u b 21 var hello3 = ( ) => { 22 console . log ( ’ Witaj ’ ) ; 23 console . log ( ’Ś wiecie ’ ) ; 24 } 25 console . log ( hello2 ( ’ world ’ ) ) ; // W y p i s z e : ” H e l l o w o r l d ” 26 hello3 ( ) ; // W y p i s z e : ” W i t a j ” 27 // ”Ś w i e c i e 3 4 5 6 7 8 9 10 11 12 13 14 15 Leksykalne this Na wyjściu Wiek=NaN Płaca=1 Wiek=NaN Płaca=2 ... Przykładowe funkcje 57 Dr inż. Stanisław Polak 58 Podstawy języka JavaScript Funkcje Podstawy języka JavaScript Funkcje K w AG H T IE łu yd zia iw Źródło: http://davidshariff.com/blog/javascript-scope-chain-and-closures/ Dr inż. Stanisław Polak er 59 at Dr inż. Stanisław Polak ia ł y Przykład użycia domknięcia at yk 1 function mnoze nie_prze z ( x ) { 2 return function ( y ) { 3 /∗ f u n k c j a w y k o r z y s t u j e d w i e z m i e n n e : 4 y − d o s t ę pn ą d l a u ż y t k o w n i k a 5 x − z d e f i n i o w a n ą t y l k o wewną t r z f u n k c j i ’ m n o z e n i e p r z e z ( ) ’ 6 ∗/ 7 return x ∗ y ; 8 }; 9 } 10 11 var iloczyn_5_ przez = mnozenie_prz ez ( 5 ) ; // p a r a m e t r o w i ’ x ’ j e s t p r z y p i s y w a n a warto ś ć 5 12 13 print ( i loczyn _5_prze z ( 1 2 ) ) ; // z o s t a n i e w y p i s a n e 5∗12 , c z y l i 60 fo rm var mojaFunkcja = utworzFunkcje ( ) ; mojaFunkcja ( ) ; // W y p i s z e : P o l a k In } tó w function wyswietlNazwe ( ) { console . log ( nazwa ) ; } return wyswietlNazwe ; 1 function one ( ) { 2 var a = 1 ; 3 two ( ) ; 4 5 function two ( ) { 6 var b = 2 ; 7 three ( ) ; 8 9 function three ( ) { 10 var c = 3 ; 11 alert ( a + b + c ) ; // 6 12 } 13 } 14 } 15 one ( ) ; // W y p i s z e : 6 en function utworzFunkcje ( ) { var nazwa = " Polak " ; ud 1 2 3 4 5 6 7 8 9 10 11 st 1 function init ( ) { 2 var nazwa = " Polak " ; 3 4 function wyswietlNazwe ( ) { 5 console . log ( nazwa ) ; 6 } 7 wyswietlNazwe ( ) ; 8 } 9 init ( ) ; //Wyś w i e t l i : P o l a k Łańcuch zasięgu dl a Domknięcia ra ko wi e Dr inż. Stanisław Polak 60 Podstawy języka JavaScript Funkcje Podstawy języka JavaScript Zmienne w funkcji Funkcje ze zmienną liczbą argumentów 1 function fun ( x ){ 2 a = ++x ; 3 b = 10; 4 } 5 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 6 a = 0 ; // <=> v a r a = 0 ; 7 console . log ( a ) ; // W y p i s z e : 0 8 console . log ( b ) ; // b i s n o t d e f i n e d 9 fun ( a ) ; 10 console . log ( a ) ; // W y p i s z e : 1 11 console . log ( b ) ; // W y p i s z e : 10 1 let a =1; 2 console . log ( a ) ; // W y p i s z e : 1 3 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 4 for ( let i = 0 ; i<10; i++) { 5 console . log ( i ) ; 6 // W y p i s z e : 1 , 2 , 3 , 4 . . . 9 7 } 8 console . log ( i ) ; // i i s n o t d e f i n e d Wyrażenie ’let’ Funkcje 1 function fun ( x ){ 2 var a = ++x ; 3 var b = 1 0 ; 4 } 5 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 6 a = 0 ; // <=> v a r a = 0 ; 7 console . log ( a ) ; // W y p i s z e : 0 8 console . log ( b ) ; // b i s n o t d e f i n e d 9 fun ( a ) ; 10 console . log ( a ) ; // W y p i s z e : 0 11 console . log ( b ) ; // b i s n o t d e f i n e d 1 function fun ( ) 2 { 3 var a = 3 ; 4 var b = 4 ; 5 if ( a === 3 ) { 6 let a = 1 0 ; // i n n a z m i e n n a ’ a ’ . Z a k r e s − wnę t r z e bloku ’ i f ’ 7 var b = 1 1 ; // t a sama z m i e n n a ’ b ’ co wy ż e j . Z a k r e s − wnę t r z e f u n k c j i ’ fun ’ 8 console . log ( a ) ; // W y p i s z e : 10 9 console . log ( b ) ; // W y p i s z e : 11 10 } 11 console . log ( a ) ; // W y p i s z e : 3 12 console . log ( b ) ; // W y p i s z e : 11 13 } 14 fun ( ) ; 1 function wypisz ( ) { 2 // p r z e j d ź po w s z y s t k i c h a r g u m e n t a c h 3 for ( var i =0; i<arguments.length ; i++) 4 console . log ( arguments [ i ] ) ; 5 } 6 7 wypisz ( " A " , " B " , " C " ) ; Na wyjściu 1 function wypisz ( a , ...pozostale ) { 2 console . log ( a ) ; 3 console . log ( Array . isArray ( pozostale ) ) ; 4 for ( licznik in pozostale ) 5 console . log ( " pozostale [ "+licznik+" ]= "+pozostale [ licznik ] ) ; 6 7 console . log ( arguments . length ) ; // S y n t a x E r r o r : ’ arguments ’ o b j e c t may n o t be u s e d i n c o n j u n c t i o n with a r e s t parameter 8 } 9 10 wypisz ( " A " , " B " , " C " ) ; Na wyjściu A B C A true pozostale[0]=B pozostale[1]=C ’let’ kontra ’var’ Dr inż. Stanisław Polak Dr inż. Stanisław Polak 61 Obiektowy model dokumentu HTML 62 Obiektowy model dokumentu HTML Document Object Model Podstawowe własności węzłów Ogólna charakterystyka I Document Object Model (DOM) — obiektowy model dokumentu. Drzewo DOM / I Dokument — drzewo obiektów I Interfejs programowy (API) dla dokumentów HTML i XML I 1 2 3 4 5 6 7 8 9 10 11 12 13 nodeType Node.ELEMENT NODE (1) Atrybut Node.ATTRIBUTE NODE (2) Text Node.TEXT NODE (3) nodeName Nazwa znacznika dużymi literami Nazwa atrybutu #text Komentarz Node.COMMENT NODE (8) #comment Dokument Node.DOCUMENT NODE (9) #document html Zbiór własności i metod do manipulacji w/w dokumentami <html> <head></ head> <body> <br> <div> <pre>Zwyk ł y tekst</ pre> <p align =’ l e f t ’> <hr /> </ p> </ div> <!−− Komentarz −−> </ body> </ html> Typ węzła Element head br body div Komentarz pre Zwykły tekst p align=’left’ hr Dokument HTML Dr inż. Stanisław Polak 63 Dr inż. Stanisław Polak 64 nodeValue null Wartość atrybutu Tekst stanowiący jego treść Treść komentarza null Obiektowy model dokumentu HTML Przykłady Obiektowy model dokumentu HTML Przykłady Wyświetlenie informacji o pojedynczym węźle element Wyświetlenie informacji o kilku węzłach element Metody getElementById() / querySelector() Metody getElementsByTagName() / querySelectorAll() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <html> <head> <title>Przyk ł ad</ title> <script type=" text / javascript "> function start ( ) { var element = document . getElementById ( " elem1 " ) ; #lub var element = document . querySelector ( " # elem1 " ) ; window . alert ( element ) ; // Wypisze : [ object HTML BodyEle ment ] window . alert ( element . nodeType ) ; // Wypisze : 1 window . alert ( element . nodeName ) ; // Wypisze : BODY window . alert ( element . nodeValue ) ; // Wypisze : null } </ script> </ head> <body id=" elem1 " onLoad=" start () ; "> </ body> </ html> Dr inż. Stanisław Polak 65 Obiektowy model dokumentu HTML <html> <head> <title>Przyk ł ad</ title> <script type=" text / javascript "> function start ( ) { var elementy = document . getElementsByTagName ( " td " ) ; #lub var elementy = document . querySelectorAll ( " tr td " ) ; window . alert ( elementy ) ; // Wypisze : [ object HTMLCollectio n ] window . alert ( elementy . length ) ; // Wypisze : 4 window . alert ( elementy [ 0 ] ) ; // Wypisze : [ object H T M L T a b l e C e l l E l e m e n t ] window . alert ( elementy [ 0 ] . nodeType ) ; // Wypisze : 1 window . alert ( elementy [ 0 ] . nodeName ) ; // Wypisze : TD window . alert ( elementy [ 0 ] . nodeValue ) ; // Wypisze : null window . alert ( elementy [ 1 ] ) ; // Wypisze : [ object H T M L T a b l e C e l l E l e m e n t ] window . alert ( elementy [ 1 ] . nodeType ) ; // Wypisze : 1 window . alert ( elementy [ 1 ] . nodeName ) ; // Wypisze : TD window . alert ( elementy [ 1 ] . nodeValue ) ; // Wypisze : null } </ script> </ head> <body onLoad=" start () ; "> <table> <tr><td>a</ td><td>b</ td></ tr> <tr><td>c</ td><td>d</ td></ tr> </ table> </ body> </ html> Dr inż. Stanisław Polak Przykłady 66 Obiektowy model dokumentu HTML Przykłady Pobieranie potomków węzłów element oraz tekst Obsługa atrybutów Własność childNodes Własność attributes oraz metody setAttribute() oraz removeAttribute() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <html> <head> <title>Przyk ł ad</ title> <script type=" text / javascript "> function start ( ) { var elementy = document . g e t E l e m e n t s B y T a g N a m e ( " tr " ) ; for ( var i=0 ; i<e l e m e n t y . l e n g t h ; i++){ var potomkowie = e l e m e n t y [ i ] . childNodes ; // o b i e k t ’ potomkowie ’ j e s t t y p u , , N o d e L i s t ’ ’ f o r ( v a r j =0; j<potomkowie . l e n g t h ; j ++){ v a r l a n c u c h = potomkowie [ j ] . nodeName + " : " + potomkowie [ j ] . childNodes [ 0 ] . n o d e V a l u e ; window . a l e r t ( l a n c u c h ) ; } } } /∗ W y p i s z e : TD: a TD: b TD: c TD: d ∗/ </ s c r i p t> </ head> <body onLoad=" start () ; "> <table border=" 1 "> <tr><td>a</ td><td>b</ td></ tr> <tr><td>c</ td><td>d</ td></ tr> </ table> </ body> </ html> Dr inż. Stanisław Polak 67 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <html> <head> <meta h t t p−e q u i v=" Content - Type " content=" text / html ; charset = UTF -8 "> <title>Przyk ł ad</ title> <script type=" text / javascript "> function zmien ( grubosc ){ var element = document . getE lementB yId ( " elem1 " ) ; // obiekt typu , , HTMLTableElement ’ ’ window . alert ( element . getAttribute ( ’ border ’ ) ) ; // Wypisze : 1 window . alert ( element . getAttribute ( ’ id ’ ) ) ; // Wypisze : elem1 element . setAttribute ( ’ border ’ , grubosc ) ; // Mo ż na i tak var atrybuty = element . attributes ; // obiekt typu , , NamedNodeMap ’ ’ window . alert ( atrybuty . border . value ) ; // Wypisze : 1 window . alert ( atrybuty . id . value ) ; // Wypisze : elem1 atrybuty . border . value = grubosc ; } function usun ( ){ var element = document . getE lementB yId ( " elem1 " ) ; element . removeAttribute ( ’ border ’ ) ; } </ script> </ head> <body> <table border=" 1 " id=" elem1 "> <tr><td>a</ td><td>b</ td></ tr> <tr><td>c</ td><td>d</ td></ tr> </ table> <form> <input type=" button " value=" Zmie ń grubo ś ć " onClick=" zmien (2) ; "> <input type=" button " value=" Usu ń " onClick=" usun () ; "> </ form> </ body> </ html> Dr inż. Stanisław Polak 68 Przykłady Obiektowy model dokumentu HTML Przykłady Wstawienie nowej komórki tabeli na początku wiersza Metody createElement() , createTextNode() oraz appendChild() Metoda insertBefore() id=’wiersz1’ td td a b1 22 23 24 AG H IE T at yk iw yd zia łu a d b ... tr id=’wiersz1’ td td td b1 a b 70 er Dr inż. Stanisław Polak 69 M at Dr inż. Stanisław Polak ia ły b td b1 c fo rm tr 11 12 13 14 15 16 17 18 19 20 21 b d In 10 ... en tó w b1 a c ud b d <html> <head> <title>Przyk ł ad</ title> <script type=" text / javascript "> function wstaw ( ) { var nowyTD = document . createElement ( " td " ) ; var nowyTekst = document . createTextNode ( " b1 " ) ; nowyTD . appendChild ( nowyTekst ) ; var element = document . getElementById ( ’ wiersz1 ’) ; var refTD = element . g e t E l e m e n t s B y T a g N a m e ( " td " ) . item ( 0 ) ; element . insertBefore ( nowyTD , refTD ) ; } </ script> </ head> <body> <table border=" 1 "> <tr id =’ w i e r s z 1 ’><td>a</ td><td>b</ td></ tr> <tr><td>c</ td><td>d</ td></ tr> </ table> <form> <input type=" button " value=" Wstaw " onClick=" wstaw () ; "> </ form> </ body> </ html> st 21 22 23 a c 1 2 3 4 5 6 7 8 9 b d a 10 11 12 13 14 15 16 17 18 19 20 a c <html> <head> <title>Przyk ł ad</ title> <script type=" text / javascript "> function wstaw ( ) { var nowyTD = document . createElement ( " td " ) ; var nowyTekst = document . createTextNode ( " b1 " ) ; nowyTD . appendChild ( nowyTekst ) ; var element = document . getElementById ( " wiersz1 ") ; element . appendChild ( nowyTD ) ; } </ script> </ head> <body> <table border=" 1 "> <tr id=" wiersz1 "><td>a</ td><td>b</ td></ tr> <tr><td>c</ td><td>d</ td></ tr> </ table> <form> <input type=" button " value=" Wstaw " onClick=" wstaw () ; "> </ form> </ body> </ html> dl 1 2 3 4 5 6 7 8 9 w K Wstawienie nowej komórki tabeli na końcu wiersza ra ko wi e Obiektowy model dokumentu HTML Obiektowy model dokumentu HTML Przykłady Obiektowy model dokumentu HTML Przykłady Zastąpienie komórki tabeli Dostęp do stylów CSS Metoda replaceChild() Obiekt „style” 1 <html> 2 <meta h t t p−e q u i v=" Content - Type " content=" text / html ; charset = UTF -8 "> 3 <head> 4 <title>Przyk ł ad</ title> 5 <script type=" text / javascript "> 6 function zastap ( ) { 7 var nowyTD = document . createElement ( " td " ) ; 8 var nowyTekst = document . createTextNode ( " b1 " ) ; 9 nowyTD . appendChild ( nowyTekst ) ; 10 var element = document . getE lementById ( ’ wiersz1 ’) ; 11 var refTD = element . g e t E l e m e n t s B y T a g N a m e ( " td " ) . item ( 0 ) ; 12 element . replaceChild ( nowyTD , refTD ) ; 13 } 14 </ script> 15 </ head> 16 <body> 17 <table border=" 1 "> 18 <tr id =’ w i e r s z 1 ’><td>a</ td><td>b</ td></ tr> 19 <tr><td>c</ td><td>d</ td></ tr> 20 </ table> 21 <form> 22 <input type=" button " value=" Zast ą p " onClick=" zastap () ; "> 23 </ form> 24 </ body> 25 </ html> Dr inż. Stanisław Polak a c b d I Cecha CSS 7−→ własność obiektu „style” I ... I I background-color 7−→ style.backgroundColor border-top-width 7−→ style.borderTopWidth Wyjątki: I tr I I id=’wiersz1’ 71 td td b1 b float 7−→ style.cssFloat class 7−→ style.className for 7−→ style.htmlFor a c Dr inż. Stanisław Polak b d 1 <html> 2 <head> 3 <meta h t t p−e q u i v=" Content - Type " content= " text / html ; charset = UTF -8 " /> 4 <title>Przyk ł ad</ title> 5 <script type=" text / javascript "> 6 function kolor ( wartosc ) { 7 var element = document . getElementBy Id ( " komorka1 " ) ; 8 element . style . b ackgro undCo lor = wartosc ; 9 } 10 </ script> 11 </ head> 12 <body> 13 <table border=" 1 "> 14 <tr><td id=" komorka1 ">a</ td><td>b</ td></ tr> 15 <tr><td>c</ td><td>d</ td></ tr> 16 </ table> 17 <form> 18 <input type=" button " value=" Czerwony " onClick="kolor(’#FF0000’); "> 19 <input type=" button " value=" Zielony " onClick="kolor(’#00FF00’); "> 20 </ form> 21 </ body> 22 </ html> 72 Obiektowy model dokumentu HTML Przykłady Podstawowe zagadnienia związane z usługą WWW Zmiana koloru tła po kliknięciu komórki tabeli Model klient-serwer Obsługa zdarzeń Usługa WWW 1 <!DOCTYPE html> 2 <meta charset=" UTF -8 "> 3 <script type=" text / javascript "> 4 function zmienKolor ( ) { 5 var komorka = document . getElementById ( " komorka " ) ; 6 komorka . style . b ackgro undColo r=’ red ’ ; 7 } 8 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 9 function wyswietlAlert ( ) { 10 alert ( " wyswietlAlert () " ) ; 11 } 12 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 13 function load ( ) { 14 var el = document . getElementBy Id ( " tabela " ) ; 15 el . addEventListener ( " click " , wyswietlAlert , false ) ; // N a j p i e r w wykona s i ę ’ z m i e n K o l o r ( ) ’ , a potem ’ w y s w i e t l A l e r t ( ) ’ . Je ż e l i t r z e c i p a r a m e t r b ę d z i e ’ t r u e ’ t o n a j p i e r w wykona s i ę ’ w y s w i e t l A l e r t ( ) ’ , a potem ’ z m i e n K o l o r ( ) ’ 16 var el = document . getElementBy Id ( " komorka " ) ; 17 el . addEventListener ( " click " , zmienKolor , false ) ; 18 } 19 </script> 20 <body onload=" load () ; "> 21 <table id=" tabela " border=" 1 "> 22 <tr><td id=" komorka ">Jeden</td></tr> 23 <tr><td>Dwa</td></tr> 24 </table> 25 </body> 26 </html> Dr inż. Stanisław Polak 73 Serwer WWW Port Adres IP Dr inż. Stanisław Polak Podstawowe zagadnienia związane z usługą WWW Przeglądarka WWW Protokół 74 Podstawowe zagadnienia związane z usługą WWW Wybrane komendy (metody) protokołu HTTP Wysyłanie danych z formularza HTML Komenda „POST” Komenda „GET” 1 GET / index . html HTTP / 1 . 1 2 Host : www . icsr . agh . edu . pl 3 1 2 3 4 5 POST / cgi−bin / search . cgi HTTP / 1 . 1 Host : www . icsr . agh . edu . pl Content−Length : 46 query=alpha+complex&casesens=false&cmd= submit Żądanie 1 2 3 4 5 6 7 8 9 10 HTTP / 1 . 1 200 OK Date : Mon , 09 Aug 2013 1 7 : 0 2 : 0 8 GMT Server : Apache / 2 . 4 . 4 ( UNIX ) Content−Length : 1776 Content−Type : text / html ; charset=utf−8 <! DOCTYPE html> <html> ... </ html> Odpowiedź Żądanie 1 2 3 4 5 6 7 8 9 10 11 HTTP / 1 . 1 200 OK Date : Mon , 09 Aug 2013 1 7 : 0 2 : 2 0 GMT Server : Apache / 2 . 4 . 4 ( UNIX ) Content−Length : 1776 Content−Type : text / html ; charset=utf−8 Connection : close Zatwierdzanie danych 7−→ kodowanie 7−→ wysyłanie do serwera WWW 1 <form method =" ... " 2 ... 3 </ form> I GET I POST enctype =" ... " a c t i o n=" ... "> I application/x-www-formurlencoded I multipart/form-data <! DOCTYPE html> <html> ... </ html> Odpowiedź Dr inż. Stanisław Polak 75 Dr inż. Stanisław Polak 76 Podstawowe zagadnienia związane z usługą WWW Podstawowe zagadnienia związane z usługą WWW Kodowanie „application/x-www-form-urlencoded” Kodowanie „multipart/form-data” Przykład Przykład 1 2 3 4 1 2 3 4 5 <form action=" http :// www . serwer . com / skrypt "> Login : <input name=" login " type=" TEXT "><br> Has ł o : <input name=" haslo " type=" PASSWORD "> </ form> Dokument HTML Login: Hasło: Jan Kowalski (Nowak) 1 login=Jan&haslo=Kowalski+%28Nowak%29 Zakodowane dane Jan Kowalski (Nowak) <form action=" ... " method=" POST " e n c t y p e=" multipart / form - data "> <input name=" login " type=" TEXT "> <input name=" haslo " type=" PASSWORD "> <input name=" plik " type=" FILE " a c c e p t=" image / jpeg , image / gif "> </ form> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 obraz.jpg POST / skrypt HTTP / 1 . 0 Content−Length : 775 Content−Type : multipart / form−data ; boundary=−−−−−−−−−−−−−−−−−−−−−−−−8152765018186645991017906692 −−−−−−−−−−−−−−−−−−−−−−−−−−8152765018186645991017906692 Content−Disposition : form−data ; name=" login " Jan −−−−−−−−−−−−−−−−−−−−−−−−−−8152765018186645991017906692 Content−Disposition : form−data ; name=" haslo " Kowalski ( Nowak ) −−−−−−−−−−−−−−−−−−−−−−−−−−8152765018186645991017906692 Content−Disposition : form−data ; name=" plik " ; filename=" obraz . jpg " Content−Type : image / jpeg Content−Transfer−Encoding : binary Zawarto ś ć pliku obraz . jpg −−−−−−−−−−−−−−−−−−−−−−−−−−8152765018186645991017906692 Dr inż. Stanisław Polak 77 Dr inż. Stanisław Polak Środowisko uruchomieniowe NodeJS Wprowadzenie Środowisko uruchomieniowe NodeJS 78 Przykład „Hello World” w K 1 #!/ usr / bin / node 2 console . log ( " Hello World " ) ; T Uruchamianie skryptu AG H hello.js łu IE Uruchamianie skryptu $ node hello.js Hello World $ node hello Hello World $ chmod 755 hello.js $ ./hello.js Hello World yd zia Udostępnia JavaScript po stronie serwera I Używa V8 JavaScript Engine I System do tworzenia serwisów sieciowych z asynchronicznym WE/WY I Wykorzystuje paradygmat programowania sterowanego zdarzeniami I Nadaje się dobrze do pisania aplikacji, które wymagają komunikacji w czasie rzeczywistym pomiędzy przeglądarką a serwerem I Pojedyncza instancja Node.js działa jako pojedynczy wątek Pętla zdarzeń — podmiot, który obsługuje / przetwarza zdarzenia zewnętrzne i konwertuje je na wywołania funkcji zwrotnych. I iw Ogólna charakterystyka fo rm Uruchamianie trybu interaktywnego at yk Node.js ra ko wi e Podstawy er Dr inż. Stanisław Polak at Źródło: http://www.aaronstannard.com/post/2011/12/14/Intro- to-NodeJS- for-NET- Developers.aspx Dr inż. Stanisław Polak 79 ia ł y dl a Rysunek: Schemat działania pętli zdarzeń w Node.js st ud en tó w In $ node > console.log("Hello World") Hello World undefined > 2+2 4 > ^D $ 80 Środowisko uruchomieniowe NodeJS Podstawy Wprowadzanie i wyprowadzanie danych Środowisko uruchomieniowe NodeJS Podstawy Dostęp do zmiennych środowiskowych, obsługa linii komend 1 process . stdout . write ( ’1 ’ ) ; 2 process . stdout . write ( ’2 ’ ) ; 3 console . log ( 3 ) 4 5 /∗ 6 console . log = function (d) { 7 p r o c e s s . s t d o u t . w r i t e ( d + ’\n ’ ) ; 8 }; 9 ∗/ 10 11 process . stdin . setEncoding ( ’ utf8 ’ ) ; 12 process . stdout . write ( ’ Wprowad ź dane - naci ś ni ę cie ^ D ko ń czy ich wprowadzanie \ n ’ ) ; 13 process . stdin . on ( ’ readable ’ , function ( ) { 14 var chunk = process . stdin . read ( ) ; 15 if ( chunk !== null ) { 16 process . stdout . write ( ’ Wczytano : ’ + chunk ) ; 17 } 18 }) ; 19 console.log(”Osiągnięto koniec skryptu”) ; 1 2 3 4 5 6 7 8 // Odczyt w a r t o ś c i z m i e n n e j ś r o d o w i s k o w e j ’HOME’ console . log ( " Tw ó j katalog domowy to : "+process . env [ ’ HOME ’ ] ) ; //Wyś w i e t l e n i e w a r t o ś c i a rgu men t ów l i n i i komend console . log ( " Argumenty linii komend to : " ) ; process . argv . forEach ( function ( wartosc , indeks , tablica ) { console . log ( ’\ t ’+indeks + ’: ’ + wartosc ) ; }) ; skrypt.js Uruchamianie skrypt.js $ node skrypt.js 1 b=2 Twój katalog domowy to: /home/polak Argumenty linii komend to: 0: node 1: /home/polak/skrypt.js 2: 1 3: b=2 Uruchamianie $ node skrypt.js 123 Wprowadź dane - naciśnięcie ^D kończy ich wprowadzanie Osiągnięto koniec skryptu abc Wczytano: abc def Wczytano: def Dr inż. Stanisław Polak Dr inż. Stanisław Polak 81 Środowisko uruchomieniowe NodeJS Podstawy Środowisko uruchomieniowe NodeJS Moduł Moduł Tworzenie Korzystanie 1 2 3 4 5 6 1 2 3 4 5 6 7 8 9 10 11 12 13 var mojModul = require ( ’mojModul’ ) ; // mojModul = require ( ” ./mojModul ” ) ; /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ console . log ( mojModul . zmienna1 ) ; // u n d e f i n e d console . log ( mojModul . zmienna2 ) ; // 2 console . log ( mojModul . zmienna3 ) ; // u n d e f i n e d console . log ( mojModul . zmienna4 ) ; // 4 console . log ( mojModul . fun1 ( ) ) ; // ” f u n 1 ” console . log ( mojModul . fun2 ( ) ) ; //B ł ą d /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ console . log ( mojModul ) ; //{ zmienna2: 2, zmienna4: 4, fun1: [Function] } console . log ( mojModul ( ) ) ; //Błąd skrypt.js 1 $ export NODE_PATH =’kat1 :kat2 :. . . :katN ’ 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 zmienna1 = 1 ; exports . zmienna2 = 2 ; var zmienna3 = 3 ; var zmienna4 ; module.exports . zmienna4 = 4 ; var exports . zmienna5 = 5 ; // S y n t a x E r r o r : Unexpected token . exports . fun1 = function ( ) { return " fun1 " ; }; fun2 = function ( ) { return " fun2 " ; }; console . log ( module ) ; /∗ Module { ... , exports : { z m i e n n a 2 : 2 , z m i e n n a 4 : 4 , f u n 1 : [ Function ] }, . . . } ∗/ exports = function ( ) { return " fun3 " ; } module . exports = function ( ) { return " fun4 " ; } console . log ( module.exports ) ; //{ zmienna2: 2, zmienna4: 4, fun1: [Function] } console . log ( exports ) ; //{ zmienna2: 2, zmienna4: 4, fun1: [Function] } console . log ( module.exports == exports ) ; //true 82 Podstawy Obsługa pakietów $ # # # npm install nazwa_pakietu Moduły -> ./node modules/ Pliki wykonywalne -> ./node modules/.bin/ Manuale -> nie są instalowane $ # # # # npm install -g nazwa_pakietu Moduły -> {prefix}/lib/node modules/ Pliki wykonywalne -> {prefix}/bin/ Manuale -> {prefix}/share/man/ {prefix} = np. /usr $ npm link nazwa pakietu # Wykonuje: ln -s {prefix}/lib/node modules/nazwa pakietu/ ./node modules/ node modules/mojModul.js Dr inż. Stanisław Polak 83 Dr inż. Stanisław Polak 84 Środowisko uruchomieniowe NodeJS Podstawy Środowisko uruchomieniowe NodeJS Obsługa plików 1 2 3 4 5 6 7 Obsługa bazy danych SQLite 3 var fs = require ( "fs" ) ; // Sprawd ź c z y p l i k i s t n i e j e try{ fs . accessSync ( ’ plik . txt ’ ) ; } catch ( err ) { fs . writeFileSync ( ’ plik . txt ’ , ’1 ’) ; } fs . readFile ( ’ plik . txt ’ , ’utf -8 ’ , function ( error , data ) { if ( error ) throw error ; console . log ( " Odczytana warto ś ć : "+ data ) ; }) ; 8 9 10 fs . writeFile ( ’ plik . txt ’ , ’2 ’ , function ( error ) { 11 if ( error ) throw error ; 12 console . log ( ’ Zapisano warto ś ć 2 ’ ) ; 13 }) ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 1 var fs = require ( " fs " ) ; 2 try{ fs . accessSync ( ’ plik . txt ’ ) } 3 catch ( err ) { fs . writeFileSync ( ’ plik . txt ’ , ’1 ’ ) ; } 4 5 fs . readFile ( ’ plik . txt ’ , ’utf -8 ’ , function ( error , data ) { 6 if ( error ) throw error ; 7 console . log ( " Odczytana warto ś ć : "+data ); 8 9 fs . writeFile ( ’ plik . txt ’ , ’2 ’ , function ( error ) { 10 if ( error ) throw error ; 11 console . log ( ’ Zapisano warto ś ć 2 ’ ) ; 12 }) ; 13 }) ; Wersja nieprawidłowa var sqlite3 = require ( ’ sqlite3 ’ ) ; var db = new sqlite3 . Database ( ’: memory : ’ ) ; // Zwraca o b i e k t Uruchamianie Uruchamianie $ node skrypt1.js Zapisano wartość 2 Odczytana wartość: 2 $ node skrypt2.js Odczytana wartość: 1 Zapisano wartość 2 jsonData = { products : [ ] }; db . each ( " SELECT rowid AS id , info FROM products " , function ( err , row ) { jsonData . products . push ({ id : row . id , info : row . info }) ; } , function ( ) { console . log ( JSON . stringify ( jsonData ) ) ; //JSON . s t r i n g i f y − wbudowana f u n k c j a JS } ); }) ; db . close ( ) ; bd.js $ npm install sqlite3 $ node bd.js {"products":[{"id":1,"info":"Produkt 0"},{"id":2,"info":"Produkt 1"}]} Dr inż. Stanisław Polak Podstawy 86 Środowisko uruchomieniowe NodeJS Tworzenie dodatków (addons) w C++ Obsługa protokołu HTTP Przykład „Hello World” Szkielet skryptu /∗ P o n i ż s z y program j e s t o d p o w i e d n i k i e m n a s t ę p u j ą c e g o kodu JS : e x p o r t s . h e l l o = f u n c t i o n ( ) { r e t u r n ’ w o r l d ’ ; }; ∗/ 3 4 5 6 #include <node . h> 7 8 using namespace v8 ; 9 10 void Method ( const FunctionCallbackInfo<Value>& args ) { 11 Isolate∗ isolate = Isolate : : GetCurrent ( ) ; 12 HandleScope scope ( isolate ) ; 13 args . GetR eturnVa lue ( ) . Set ( String : : NewFromUtf8 ( isolate , " world " ) ) ; 14 } 15 16 void init ( Handle<Object> exports ) { 17 NOD E_S ET_M ET H OD ( exports , " hello " , Method ) ; 18 } 19 20 NODE_MODULE ( hello , init ) // t u t a j n i e ma ś r e d n i k a 1 { 2 " targets " : [ 3 { 4 " target_name " : " hello " , 5 " sources " : [ " hello . cc " ] 6 } 7 ] 8 } binding.gyp $ npm install -g node-gyp Dr inż. Stanisław Polak 5 6 7 8 9 10 11 var http = require ( " http " ) ; function requestListener ( request , response ) { console . log ( " Pojawi ł o si ę ż ą danie od klienta " ) ; response . writeHead ( 2 0 0 , {" Content - Type " : " text / plain "}) ; response . write ( " Hello World " ) ; response . end ( ) ; } var serwer = http . createServer ( requestListener ) ; serwer . listen ( 8 0 8 0 ) ; console . log ( " Uruchomiono serwer " ) ; 1 2 3 4 5 6 7 8 9 var http = require ( " http " ) ; http . createServer ( function ( request , response ) { console . log ( " Pojawi ł o si ę ż ą danie od klienta " ) ; response . writeHead ( 2 0 0 , {" Content - Type " : " text / plain "}) ; response . write ( " Hello World " ) ; response . end ( ) ; }) . listen ( 8 0 8 0 ) ; console . log ( " Uruchomiono serwer " ) ; Wersja alternatywna 2 var addon = require ( ’ ./ build / Release / hello ’ ); console . log ( addon . hello ( ) ) ; hello.js Sprawdzenie działania Z poziomu terminala hello.cc Instalacja programu „node-gyp” 1 2 3 4 Obsługa protokołu HTTP serwer.js 1 ’ Statement ’ Instalacja i uruchamianie 85 Środowisko uruchomieniowe NodeJS ’ Database ’ db . serialize ( function ( ) { db . run ( " CREATE TABLE products ( info TEXT ) " ) ; var stmt = db . prepare ( " INSERT INTO products VALUES (?) " ) ; // Zwraca o b i e k t for ( var i = 0 ; i < 2 ; i++) { stmt . run ( " Produkt " + i ) ; } stmt . finalize ( ) ; Wersja prawidłowa Dr inż. Stanisław Polak 1 2 Podstawy Kompilacja i uruchomienie $ node-gyp configure $ node-gyp build $ node hello.js world 87 $ node serwer.js & Uruchomiono serwer $ curl http://localhost:8080 Pojawiło się żądanie od klienta Hello World Dr inż. Stanisław Polak Rysunek: Z poziomu przeglądarki WWW 88 Obsługa formularzy 6 7 8 response . writeHead ( 2 0 0 , {" Content - Type " : " text / plain "}) ; 9 response . write ( ’\ n ’ ) ; 10 response . write ( url_parts . pathname+’\ n ’ ) ; 11 response . write ( ’ Login : ’+url_parts . query [ ’ login ’]+ ’\ n ’ ) ; 12 response . write ( ’ Has ł o : ’+url_parts . query [ ’ haslo ’]+ ’\ n ’ ) ; 13 response . end ( ) ; 14 } 15 . . . serwer.js K var qs = require ( ’querystring’ ) ; ... function r equ estL i st en e r ( request , response ) { var url_parts = url . parse ( request . url , true ) ; if ( url_parts . pathname == ’/form’ ){ // g e n e r o w a n i e f o r m u l a r z a response . writeHead ( 2 0 0 , {" Content - Type " : " text / html "}) ; response . write ( ’ < form method =" POST " action ="/ submit " > ’ ) ; response . write ( ’ < input name =" login " value =" Jan " > ’ ) ; response . write ( ’ < input name =" haslo " value =" Kowalski ( Nowak ) ą ę " > ’ ) ; response . write ( ’ < input type =" submit " > ’ ) ; response . write ( ’ </ form > ’ ) ; response . end ( ) ; } if ( url_parts . pathname == ’/submit’ ) { // p r z e t w a r z a n i e z a w a r t o ś c i f o r m u l a r z a if ( request . method==’ GET ’ ) { response . writeHead ( 2 0 0 , {" Content - Type " : " text / plain "}) ; response . write ( url_parts . query [ ’ login ’]+ ’\ n ’ ) ; // p r z e g l ą d a r k a w y p i s z e : ” Jan\n” response . write ( url_parts . query [ ’ haslo ’]+ ’\ n ’ ) ; // p r z e g l ą d a r k a w y p i s z e : ” K o w a l s k i ( Nowak ) ą ę \n” 19 response . end ( ) ; 20 } 21 else if ( request . method==’ POST ’ ) { 22 var body=’ ’ ; 23 request . on ( ’data’ , function ( data ) { 24 body +=data ; 25 }) ; 26 request . on ( ’end’ , function ( ){ 27 var data = qs . parse ( body ) ; // body z a w i e r a ” l o g i n=Jan&h a s l o=K o w a l s k i+%28Nowak%29+%C4%85% C4%99” 28 response . writeHead ( 2 0 0 , {" Content - Type " : " text / plain "}) ; 29 response . write ( data [ ’ login ’]+ ’\ n ’ ) ; // p r z e g l ą d a r k a w y p i s z e : ” Jan\n” 30 response . write ( data [ ’ haslo ’]+ ’\ n ’ ) ; // p r z e g l ą d a r k a w y p i s z e : ” K o w a l s k i ( Nowak ) ą ę\n” 31 response . end ( ) ; 32 }) ; 33 } 34 } 35 } Dr inż.36Stanisław Polak 90 ... w 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 dl /abc Jan Kowalski (Nowak) en tó w $ curl ’http://localhost:8080/abc?login=Jan&haslo= Kowalski+%28Nowak%29’ ud Terminal 2 89 M at Dr inż. Stanisław Polak er ia ły $ node serwer.js Uruchomiono serwer Pojawiło się żądanie od klienta { ... search: ’?login=Jan&haslo=Kowalski+%28Nowak%29’, query: { login: ’Jan’, haslo: ’Kowalski (Nowak)’ }, pathname: ’/abc’, path: ’/abc?login=Jan&haslo=Kowalski+%28Nowak%29’, href: ’/abc?login=Jan&haslo=Kowalski+%28Nowak%29’ } st Terminal 1 In fo rm Na wyjściu Kodowanie „application/x-www-form-urlencoded” AG H var url = require ( " url " ) ; ... function r e qu es tL i st en e r ( request , response ) { console . log ( " Pojawi ł o si ę ż ą danie od klienta " ) ; var url_parts = url . parse ( request . url , true ) ; // P a s s t r u e a s t h e s e c o n d a r g u m en t t o a l s o p a r s e t h e q u e r y s t r i n g u s i n g t h e q u e r y s t r i n g module . D e f a u l t s t o f a l s e . console . log ( url_parts ) ; a 1 2 3 4 5 Obsługa protokołu HTTP IE T Obsługa parametrów URL Środowisko uruchomieniowe NodeJS ra ko wi e Obsługa protokołu HTTP at yk iw yd zia łu Środowisko uruchomieniowe NodeJS Środowisko uruchomieniowe NodeJS Obsługa protokołu HTTP Wolnostojący serwer WWW Framework „Express” Podstawy Express Ogólna charakterystyka Instalacja i uruchamianie $ npm install http-server -g $ http-server -h usage: http-server [path] [options] options: -p -a -d -i -e --ext -s --silent -h --help -c Port to use [8080] Address to use [0.0.0.0] Show directory listings [true] Display autoIndex [true] Default file extension if none supplied [none] Suppress log messages from output Print this list and exit. Set cache time (in seconds). e.g. -c10 for 10 seconds. To disable caching, use -c-1. I Najpopularniejszy framework do tworzenia aplikacji WWW I Inspirowany projektem Ruby „Sinatra” I Moduł node.js — instalacja npm install -g express I API oparte na JSON $ http-server Starting up http-server, serving ./ on port: 8080 Hit CTRL-C to stop the server Dr inż. Stanisław Polak 91 Dr inż. Stanisław Polak 92 Framework „Express” Aplikacja „Hello World 1” Użyte narzędzia oraz języki Framework „Express” Tworzenie szkieletu aplikacji 1 2 3 4 I $ $ $ $ mkdir MySite cd MySite vi package . json npm install #i n s t a l o w a n i e z a l e ż no ś c i Jade I I I Aplikacja „Hello World 1” System szablonów Treść szablonu jest tłumaczona na HTML CSS 1 { 2 3 4 5 6 7 8 9 10 } " name " : " MySite " , " version " : " 0.0.1 " , " private " : " true " , " dependencies " : { " express " : " * " , " jade " : " * " , " morgan " : " * " } package.json Dr inż. Stanisław Polak Framework „Express” 93 Aplikacja „Hello World 1” Główny plik aplikacji 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Dr inż. Stanisław Polak 94 Framework „Express” Aplikacja „Hello World 1” Pliki Jade var express = require ( ’ express ’ ) , logger = require ( ’ morgan ’ ) ; var app = express ( ) ; var router = express . Router ( ) ; app . set ( ’ views ’ , __dirname + ’/ views ’ ) ; app . set ( ’ view engine ’ , ’ jade ’ ) ; app . use ( logger ( ’ dev ’ ) ) ; app . use ( express . static ( __dirname + ’/ public ’ ) ) ; router . get ( ’/ ’ , function ( req , res ) { res . render ( ’ index ’ , { title : ’ Home ’ } ) }) ; app . use ( ’/ ’ , router ) ; app . listen ( 3 0 0 0 ) ; 1 extend layout 2 block content 3 p 4 | Witaj Ś wiecie 5 | Witaj Ś wiecie 6 p 7 | Witaj Ś wiecie 8 block sidebar 9 . widget 10 h1 Widget 11 p 12 | Tre ś ć ramki views/index.jade 1 doctype html 2 html 3 head 4 title #{title} − My Site 5 link ( rel=’ stylesheet ’ , href=’/ stylesheets / style . css ’ ) 6 body 7 header 8 h1 My Site 9 . container 10 . main−content 11 block content 12 . sidebar 13 block sidebar 14 footer 15 p Running on node with Express , Jade and Stylus app.js Dr inż. Stanisław Polak views/layout.jade 95 Dr inż. Stanisław Polak 96 Framework „Express” Aplikacja „Hello World 1” Plik CSS Framework „Express” Aplikacja „Hello World 1” Uruchamianie aplikacji 1 $ node app 2 GET / 200 1563 ms − 444 b 3 GET / stylesheets / style . css 200 865 ms − 2 . 4 6 kb 1 body { 2 ... 3 } 4 . widget { 5 ... 6 } 7 ... public/stylesheets/style.css Dr inż. Stanisław Polak Aplikacja „Hello World 2” Dr inż. Stanisław Polak 98 Framework „Express” Aplikacja „Hello World 2” Polecenie express ra ko wi e Framework „Express” 97 Generowanie aplikacji „Hello World” T IE łu yd zia iw at yk fo rm Dr inż. Stanisław Polak er 99 at Dr inż. Stanisław Polak ia ł y dl a st ud en tó w In 1 $ npm install −g express−generator 2 $ express −−help 3 Usage : express [ options ] [ dir ] 4 5 Options : 6 7 −h , −−help output usage information 8 −V , −−version output the version number 9 −e , −−ejs add ejs engine support ( defaults to jade ) 10 −−hbs add handlebars engine support 11 −H , −−hogan add hogan . js engine support 12 −c , −−css <engine> add stylesheet <engine> support ( less | stylus | compass ) ( defaults to plain css ) 13 −f , −−force force on non−empty directory 1 $ express MySite 2 create : MySite 3 create : MySite / package . json 4 create : MySite / app . js 5 create : MySite / public 6 create : MySite / public / javascripts 7 create : MySite / public / images 8 create : MySite / public / stylesheets 9 create : MySite / public / stylesheets / style . css 10 create : MySite / routes 11 create : MySite / routes / index . js 12 create : MySite / routes / users . js 13 create : MySite / views 14 create : MySite / views / index . jade 15 create : MySite / views / layout . jade 16 create : MySite / views / error . jade 17 create : MySite / bin 18 create : MySite / bin / www 19 20 install dependencies : 21 $ cd MySite && npm install 22 23 run the app : 24 $ DEBUG=MySite : ∗ npm start AG H w K Użycie polecenia express 100 Framework „Express” Aplikacja „Hello World 2” Plik ’package.json’ 1 2 3 4 5 6 7 8 9 Dr inż. Stanisław Polak 101 Framework „Express” Aplikacja „Hello World 2” Pliki z definicją tras ... var routes = require ( ’ ./ routes / index ’ ) ; var users = require ( ’ ./ routes / users ’ ) ; var app = express ( ) ; ... app . use ( ’/ ’ , routes ) ; app . use ( ’/ users ’ , users ) ; ... Dr inż. Stanisław Polak 102 Framework „Express” Aplikacja „Hello World 2” Pozostałe (wygenerowane) pliki 1 extends layout 2 3 block content 4 h1= title 5 p Welcome to #{title} var express = require ( ’ express ’ ) ; var router = express . Router ( ) ; /∗ GET home page . ∗/ router . get ( ’/ ’ , function ( req , res ) { res . render ( ’ index ’ , { title : ’ Express ’ }) ; }) ; views/index.jade 1 doctype html 2 html 3 head 4 title= title 5 link ( rel=’ stylesheet ’ , href=’/ stylesheets / style . css ’ ) 6 body 7 block content views/layout.jade module . exports = router ; routes/index.js 1 2 3 4 5 6 7 8 9 Aplikacja „Hello World 2” Główny plik aplikacji — ’app.js’ 1 { 2 " name " : " MySite " , 3 " version " : " 0.0.0 " , 4 " private " : true , 5 " scripts " : { 6 " start " : " node ./ bin / www " 7 }, 8 " dependencies " : { 9 " body - parser " : " ~1.13.2 " , 10 " cookie - parser " : " ~1.3.5 " , 11 " debug " : " ~2.2.0 " , 12 " express " : " ~4.13.1 " , 13 " jade " : " ~1.11.0 " , 14 " morgan " : " ~1.6.1 " , 15 " serve - favicon " : " ~2.3.0 " 16 } 17 } 1 2 3 4 5 6 7 8 9 Framework „Express” var express = require ( ’ express ’ ) ; var router = express . Router ( ) ; /∗ GET u s e r s l i s t i n g . ∗/ router . get ( ’/ ’ , function ( req , res ) { res . send ( ’ respond with a resource ’ ) ; }) ; 1 2 3 4 5 6 7 8 body { padding : 50 px ; font : 14 px " Lucida Grande " , Helvetica , Arial , sans−serif ; } a { color : #00B7FF ; } public/stylesheets/style.css module . exports = router ; routes/user.js 1 $ cd MySite && npm install 2 $ npm start Instalowanie zależności i uruchamianie aplikacji Dr inż. Stanisław Polak 103 Dr inż. Stanisław Polak 104 Framework „Express” Aplikacja „Hello World 3” MongoDB Framework „Express” Aplikacja „Hello World 3” Model danych w MongoDB Ogólna charakterystyka I Nierelacyjna baza danych zorientowana dokumentowo I Dobrze skalowana I Szybka I Nie posiada sztywnych schematów danych Referencje Osadzane dokumenty Podstawowe pojęcia Kolekcja odpowiednik tabeli w relacyjnej bazie danych Dokument odpowiednik wiersza w relacyjnej bazie danych Rysunek: Przykładowy dokument Dr inż. Stanisław Polak 105 Framework „Express” Aplikacja „Hello World 3” Instalowanie zależności Framework „Express” 106 Aplikacja „Hello World 3” Tworzenie zawartości bazy danych 1 $ vi package . json 2 $ npm install #i n s t a l o w a n i e z a l e ż no ś c i 1 ... 2 " dependencies " : { 3 ... 4 " monk " : " * " 5 } 6 ... package.json Dr inż. Stanisław Polak Dr inż. Stanisław Polak 107 1 2 3 4 5 6 7 8 9 10 11 12 $ mongo MongoDB shell version : 2 . 6 . 3 connecting to : test > use bazatestowa1 switched to db bazatestowa1 > db . data collecti on . insert ({ " title " : " Express & Mongo " }) > db . data collecti on . insert ({ " title " : " Express " }) > db . datacollection . find ( ) { " _id " : ObjectId ( " 52 f 8 b b 7 5 7 b a d e 7 e 2 c 4 7 4 1 7 4 1 " ) , " title " : " Express & Mongo " } { " _id " : ObjectId ( " 52 f 8 b d 4 0 7 b a d e 7 e 2 c 4 7 4 1 7 4 2 " ) , " title " : " Express " } > db . datacollection . find ({ " title " : " Express " }) { " _id " : ObjectId ( " 52 f 8 b d 4 0 7 b a d e 7 e 2 c 4 7 4 1 7 4 2 " ) , " title " : " Express " } Dr inż. Stanisław Polak 108 Aplikacja „Hello World 3” Technika „AJAX” I I routes/index.js I app.js Rysunek: Schemat działania typowej witryny internetowej ud en tó w 1 extends layout 2 3 block content 4 h1 Tytu ł y 5 ul 6 each element in titlelist 7 li #{element . title} Wysyłanie zapytania do serwera bez przeładowywania strony, Aplikacja może dokonywać szybkich, przyrostowych aktualizacji w interfejsie użytkownika bez potrzeby przeładowywania całej strony w przeglądarce Parsowanie i praca z dokumentami XML K AJAX = HTML + CSS + DOM + XMLHttpRequest + XML + JavaScript Możliwości: w I AG H AJAX (ang. Asynchronous JavaScript and XML), Asynchroniczny JavaScript i XML IE T I at yk iw yd zia łu 1 ... 2 router . get ( ’/ titles ’ , function ( req , res ) { 3 var db = req . db ; 4 var collection = db . get ( ’ data collection ’ ) ; 5 collection . find ({} ,{} , function ( e , docs ) { 6 res . render ( ’ titlelist ’ , { 7 " titlelist " : docs 8 }) ; 9 }) ; 10 }) ; 11 12 module . exports = router ; fo rm 6 7 8 9 10 11 12 13 14 15 ... var bodyParser = require ( ’ body - parser ’ ) ; //Nowy kod var monk = require ( ’ monk ’ ) ; var db = monk ( ’ localhost :27017/ bazatestowa1 ’ ) ; ... //Nowy kod app . use ( function ( req , res , next ) { req . db = db ; next ( ) ; }) ; // I s t n i e j ą c y kod app . use ( ’/ ’ , routes ) ; app . use ( ’/ users ’ , users ) ; ... Rysunek: Schemat działania witryny internetowej opartej o AJAX dl a I st 1 2 3 4 5 AJAX In Modyfikacje ra ko wi e Framework „Express” ły Czy warto go zawsze stosować? ia 109 Dr inż. Stanisław Polak 110 M at Dr inż. Stanisław Polak I er views/titlelist.jade Technika „AJAX” Technika „AJAX” Zapytanie 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Obsługa odpowiedzi var http_request ; if ( window.ActiveXObject ) { // IE ¬ 6 try { http_request = new ActiveXObject(”Msxml2.XMLHTTP”) ; } catch ( e ) { try { http_request = new ActiveXObject(”Microsoft.XMLHTTP”) ; } catch ( e ) {} } } else if ( window.XMLHttpRequest ) { // M o z i l l a , S a f a r i , IE 7 , . . . http_request = new XMLHttpRequest ( ) ; if ( http_request . ov err ideMi meTy pe ) { http request.overrideMimeType(’text/xml’) ; } } if ( ! http_request ) alert ( ’ Nie mog ę stworzy ć instancji obiektu XMLHTTP ’ ) ; http request.onreadystatechange = function ( ) { alertContents ( http_request ) ; } ; http request.open ( ’ GET ’ , " / zadany_plik . html " , true ) ; http request.send ( null ) ; //http request.open ( ’ POST, ”/ s k r y p t . c g i ” , t r u e ) ; //http request.setRequestHeader ( ’ C o n t e n t−Type ’ , ’ a p p l i c a t i o n / x−www−form−u r l e n c o d e d ’ ) ; //http request.send ( ’ p o l e 1=w a r t o s c 1&p o l e 2=w a r t o s c 2 & . . . ’ ) ; 1 <table> 2 <tr><td>Hello</ td></ tr> 3 </ table> 1 function alertContents ( http_request ) { 2 try { 3 if ( http request.readyState == 4 ) { 4 if ( http request.status == 200 ) { 5 alert ( http request.responseText ) ; 6 var xmldoc = http request.responseXML ; 7 var root_node = xmldoc . g e t E l e m e n t s B y T a g N a m e ( ’ td ’ ) . item ( 0 ) ; 8 alert ( root_node . firstChild . data ) ; 9 } 10 else { 11 alert ( ’ Wyst ą pi ł problem z tym zadaniem . ’ ) ; 12 } 13 } 14 } catch ( e ) { alert ( ’ Zlapany wyjatek : ’ + e . description ) ; } 15 } zadany plik.html Dr inż. Stanisław Polak 111 Dr inż. Stanisław Polak 112 Biblioteka „ jQuery” Biblioteka „ jQuery” jQuery Podstawy Ogólna charakterystyka I I Lekka biblioteka programistyczna Funkcjonalności: I I I I I I I I Podstawowe cechy: I I I I I Selektory — umożliwiają wybranie dowolnego podzbioru węzłów modelu DOM Atrybuty — jQuery pozwala przetwarzać atrybuty węzłów element Manipulowanie modelem DOM Zmiana i przypisywanie stylu do elementów Rozbudowana obsługa zdarzeń, możliwość definiowania własnych Efekty — animacje AJAX — prosty interfejs realizujący asynchroniczne zapytania Niezależność od przeglądarki — eliminuje konieczność dostosowywania kodu do różnych przeglądarek WWW Obsługa selektorów zgodna z CSS3 Małe rozmiary — produkcyjna wersja to około 100 kB Wygoda tworzenia wtyczek 1 <html> 2 <head> 3 <meta charset=" utf -8 "> 4 <title>jQuery demo</title> 5 </head> 6 <body> 7 <a href=" http :// jquery . com / ">jQuery</a> 8 <script type=" text / javascript " src=" http :// code . jquery . com / jquery - latest . js "></script> 9 <script type=" text / javascript "> 10 //$ ( document ) . r e a d y ( f u n c t i o n ( ) { 11 jQuery ( document ) . ready ( function ( ) { 12 $(”a”) . click ( function ( event ) { 13 alert ( " Jak widzisz , ten odsy ł acz nie przeniesie ci ę ju ż do jquery . com " ) ; 14 event . preventDefau lt ( ) ; 15 }) ; 16 }) ; 17 </script> 18 </body> 19 </html> Strona domowa — http://jquery.com/ Dr inż. Stanisław Polak 113 Biblioteka „ jQuery” Dr inż. Stanisław Polak 114 Biblioteka „ jQuery” Pobieranie treści tekstowej Dostęp do stylów CSS Odpowiednik przykładu DOM 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <!DOCTYPE html> <html> <head> <style> p { color : blue ; margin : 8 px ; } b { color : red ; } </style> <script src=" http :// code . jquery . com / jquery - latest . js "></script> </head> <body> <p><b>Test</b> Paragraph .</p> <p></p> <script type=" text / javascript "> var str = $ ( " p : first " ) . text ( ) ; // Zmienna ’ s t r ’ z a w i e r a ł a ń c u c h ” T e s t P a r a g r a p h . ” $ ( " p : last " ) . html ( str ) ; </script> </body> </html> 1 <html> 2 <head> 3 <meta h t t p−e q u i v=" Content - Type " content=" text / html ; charset = UTF -8 " /> 4 <title>Przyk ł ad</ title> 5 ... 6 </ head> 7 <body> 8 <table border=" 1 "> 9 <tr><td id=" komorka1 ">a</ td><td>b</ td></ tr> 10 <tr><td>c</ td><td>d</ td></ tr> 11 </ table> 12 <form> 13 <input type=" button " value=" Czerwony " onClick=" kolor(’#FF0000’); "> 14 <input type=" button " value=" Zielony " onClick=" kolor(’#00FF00’); "> 15 </ form> 16 </ body> 17 </ html> 1 ... 2 <script type=" text / javascript "> 3 function kolor ( wartosc ){ 4 $ ( ’# komorka1 ’ ) . css ( " ba ck g ro un dC o lo r " , wartosc ) ; 5 } 6 </ script> Test Paragraph. Test Paragraph. a c 1 <script type=" text / javascript "> 2 function kolor ( wartosc ){ 3 var element = document . getE lementById ( " komorka1 " ) ; 4 element . style . b ac kg ro undCo l or = wartosc ; 5 } 6 </ script> Użycie metod jQuery Dr inż. Stanisław Polak 115 Dr inż. Stanisław Polak b d Użycie metod DOM 116 Biblioteka „ jQuery” Biblioteka „ jQuery” Dodawanie nowego elementu do zbioru dopasowanych elementów Wstawienie nowej komórki tabeli na końcu wiersza Odpowiednik przykładu DOM 1 2 3 4 5 6 7 8 9 10 11 12 13 <!DOCTYPE html> <html> <head> <script src=" http :// code . jquery . com / jquery - latest . js "></script> </head> <body> <p>Hello</p><span>Hello Again</span> <script type=" text / javascript "> $ ( " p " ) . add ( " span " ) . css ( " background " , " yellow " ) ; </script> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <html> <head> <title>Przyk ł ad</ title> ... </ head> <body> <table border=" 1 "> <tr id=" wiersz1 "><td>a</ td><td>b</ td></ tr> <tr><td>c</ td><td>d</ td></ tr> </ table> <form> <input type=" button " value=" Wstaw " onClick=" wstaw () ; "> </ form> </ body> </ html> </body> </html> Hello a c b d b d b1 1 ... 2 <script type=" text / javascript "> 3 function wstaw ( ){ 4 var nowyTD = document . createElement ( " td " ) ; 5 var nowyTekst = document . crea teTextNode ( " b1 " ) ; 6 nowyTD . appendChild ( nowyTekst ) ; 7 var element = document . getE lementById ( " wiersz1 ") ; 8 element . appendChild ( nowyTD ) ; 9 } 10 </ script> 11 . . . 1 ... 2 <script type=" text / javascript "> 3 function wstaw ( ){ 4 $(’#wiersz1’) . append ( $(’<td>’) . text ( ’ b1 ’ ) ) ; 5 } 6 </ script> 7 ... Hello Again a c Użycie metod jQuery Użycie metod DOM Dr inż. Stanisław Polak 117 Dr inż. Stanisław Polak Biblioteka „ jQuery” Animacja tekstu ra ko wi e Biblioteka „ jQuery” 118 Obsługa technologii AJAX <!DOCTYPE html> <html> <head> <style> div { background−color :# bca ; width : 1 0 0 px ; border : 1 px solid green ; } </style> <script src=" http :// code . jquery . com / jquery - latest . js " ></script> 12 </head> 13 <body> 14 <button id=" go ">» ; Run</button> 15 16 <div id=" block ">Hello!</div> 17 <script type=" text / javascript "> 18 19 /∗ K o r z y s t a n i e z w i e l u t y p ów j e d n o s t e k w j e d n e j a n i m a c j i . ∗/ 20 21 $ ( " # go " ) . click ( function ( ){ 22 $ ( " # block " ) . animate ({ 23 width : " 70% " , 24 opacity : 0 . 4 , 25 marginLeft : " 0.6 in " , 26 fontSize : " 3 em " , 27 borderWidth : " 10 px " 28 } , 1500 ) ; 29 }) ; 30 </script> 31 </body> 32 </html> In tó w AG H T IE yd zia łu if ( url_parts . pathname == ’/ hello ’ ){ response . writeHead ( 2 0 0 , {" Content - Type " : " text / plain "}) ; response . write ( " Witaj Ś wiecie " ) ; response . end ( ) ; } else { var filename=" formularz . html " var stat = fs . statSync ( filename ) ; response . writeHead ( 2 0 0 , { ’ Content - Type ’ : ’ text / html ’ , ’ Content - Length ’ : stat . size }) ; var readStream = fs . c r ea te R e a dS tr e am ( filename ) ; readStream . pipe ( response ) ; } 21 22 23 } 24 var serwer = http . createServer ( r eq ue st Lis te n er ) 25 serwer . listen ( 8 0 8 0 ) ; ud en Rysunek: Ostatnia klatka animacji function re qu es tL i st en er ( request , response ) { var url_parts = url . parse ( request . url , true ) ; at yk 10 11 12 13 14 15 16 17 18 19 20 fo rm Rysunek: Pierwsza klatka animacji 1 ... 2 <script type=" text / javascript "> 3 $ ( document ) . ready ( function ( ){ 4 $ ( ’# button1 ’ ) . click ( function ( ) { 5 $ . ajax ({ 6 type : " GET " , 7 url : " http :// localhost :8080/ hello " , 8 success : function ( msg ){ 9 alert ( " Zdalny skrypt wypisa ł : " + msg ) ; 10 } 11 }) ; 12 }) ; 13 }) ; 14 </script> 15 . . . 16 <form action=" # "> 17 <input type=" button " value=" Uruchom " id=" button1 " /> 18 </form> 19 . . . var http = require ( " http " ) ; var url = require ( " url " ) ; var fs = require ( ’ fs ’ ) ; iw 1 2 3 4 5 6 7 8 9 dl a st node.js Dr inż. Stanisław Polak er 119 ia ł y formularz.html at Dr inż. Stanisław Polak w K 1 2 3 4 5 6 7 8 9 10 11 120 JavaScript — zagadnienia zaawansowane Inne zagadnienia Tryb ścisły JavaScript — zagadnienia zaawansowane Inne zagadnienia Tryb ścisły Przykłady działania I Eliminuje niektóre „pułapki” starszych wersji języka I Naprawia błędy, które utrudniały silnikom JavaScriptu dokonywanie optymalizacji I Uniemożliwia stosowanie składni, która zostanie wykorzystana w kolejnych wersjach ECMAScriptu 1 " use strict " ; 2 var v = " Cze ś ć ! Jestem skryptem trybu ś cis ł ego ! " ; Włączenie trybu ścisłego dla całego skryptu 1 2 3 4 5 6 7 8 function strict ( ) { // t r y b ś c i s ł y na p o z i o m i e f u n k c j i ’ use strict ’ ; function nested ( ) { return " Ja te ż " ; } return " Cze ś ć ! Jestem funkcj ą trybu ś cis ł ego ! " + nested ( ) ; } function notStrict ( ) { return " A ja nie . " ; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 " use strict " ; var v = " Cze ś ć ! Jestem skryptem trybu ś cis ł ego ! " ; zmienna = 1 7 ; // w y r z u c a w y j ą t e k R e f e r e n c e E r r o r delete Object . prototype ; // w y r z u c a w y j ą t e k T y p e E r r o r var x = 1 7 ; with ( obj ) // ! ! ! b ł ą d s k ł a d n i { // Gdyby t o n i e by ł t r y b ś c i s ł y , c z y by ł oby t o v a r x , // c z y moż e j e d n a k o b j . x ? W og ó lnym p r z y p a d k u // n i e moż na t e g o o k r e ś l i ć p r z e d wykonaniem kodu , // co uniemo ż l i w i a o p t y m a l i z a c j ę . x; } Włączenie trybu ścisłego dla funkcji Dr inż. Stanisław Polak 121 JavaScript — zagadnienia zaawansowane Dr inż. Stanisław Polak Inne zagadnienia Magazyny danych 122 JavaScript — zagadnienia zaawansowane Inne zagadnienia Magazyny danych Przykład użycia Typy I Magazyn lokalny — obiekt ’localStorage’ I Magazyn sesji — obiekt ’sessionStorage’ Ogólna charakterystyka I Są dostępne tylko z poziomu klienta I Dane są dostępne dla stron, które mają to samo pochodzenie co zapisane informacje I Pary postaci klucz-wartość I Maksymalny rozmiar przechowywanych tam danych jest znacznie większy niż w przypadku ciasteczek Strony traktowane jako różne I http://www.agh.edu.pl I https://www.agh.edu.pl — inny protokół I http://www.agh.edu.pl:8080 — inny numer portu. Domyślny port HTTP to 80 I http://poczta.agh.edu.pl — inny host 1 if ( typeof ( Storage ) !== " undefined " ) { 2 localStorage . setItem ( " nazwisko " , " Polak " ) ; 3 // l u b 4 localStorage . nazwisko = " Polak " ; 5 // l u b 6 localStorage [ ’ nazwisko ’ ] = " Polak " ; 7 var nazwisko = localStorage . getItem ( " nazwisko " ) ; 8 console . log ( nazwisko ) ; 9 localStorage . removeItem ( " nazwisko " ) ; 10 // l u b 11 delete sessionStor age . nazwisko ; 12 var nazwisko = localStorage . getItem ( " nazwisko " ) ; 13 console . log ( nazwisko ) ; 14 localStorage . setItem ( " imie " , " Stanis ł aw " ) ; 15 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 16 sess ionStora ge . setItem ( " nazwisko " , " Polak " ) ; 17 // l u b 18 sess ionStora ge . nazwisko = " Polak " ; 19 // l u b 20 sess ionStora ge [ ’ nazwisko ’ ] = " Polak " 21 var nazwisko = sess ionStora ge . getItem ( " nazwisko " ) ; 22 console . log ( nazwisko ) ; 23 sess ionStora ge . removeItem ( " nazwisko " ) ; 24 // l u b 25 delete sessionStor age . nazwisko ; 26 var nazwisko = sess ionStora ge . getItem ( " nazwisko " ) ; 27 console . log ( nazwisko ) ; 28 sess ionStora ge . setItem ( " imie " , " Stanis ł aw " ) ; 29 } 30 else 31 alert ( " Twoja przegl ą darka nie obs ł uguje magazyn ó w " ) ; 1 <script> 2 if ( typeof ( Storage ) !== " undefined " ) { 3 var imi ę = localStorage . getItem ( " imie " ) ; 4 console . log ( imi ę ) ; 5 var imi ę = sessionStora ge . getItem ( " imie " ) ; 6 console . log ( imi ę ) ; 7 } 8 else 9 alert ( " Twoja przegl ą darka nie obs ł uguje magazyn ó w " ) ; 10 </script> skrypt2.html skrypt1.html Dr inż. Stanisław Polak 123 Dr inż. Stanisław Polak 124 JavaScript — zagadnienia zaawansowane Inne zagadnienia Magazyny danych JavaScript — zagadnienia zaawansowane Inne zagadnienia Iteratory Przechowywanie danych niebędących napisami 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 var liczba = 1 ; tablica = [ 1 , 2 , 3 ] ; obiekt = {a : 1 0 , b : 2 0 } ; 1 2 3 4 5 6 7 8 9 10 11 // W s t a w i a n i e d a n e j t y p u p r o s t e g o localStorage . setItem ( " liczba " , liczba ) ; liczba = Number ( localStorage . getItem ( " liczba " ) ) ; console . log ( liczba ) ; // W s t a w i a n i e d a n y c h t y p u z ł o ż onego localStorage . setItem ( " tablica " , JSON . stringify ( tablica ) ) ; tablica = JSON . parse ( localStorage . getItem ( " tablica " ) ) ; console . log ( tablica ) ; 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 localStorage . setItem ( " obiekt " , JSON . stringify ( obiekt ) ) ; obiekt = JSON . parse ( localStorage . getItem ( " obiekt " ) ) ; console . log ( obiekt ) ; Na wyjściu 1 Array [ 1, 2, 3 ] Object a: 10, b: 20 Dr inż. Stanisław Polak Dr inż. Stanisław Polak 125 JavaScript — zagadnienia zaawansowane Inne zagadnienia Generatory function* gener atorWar to ś ci ( ) { yield " Jeden " ; yield " Dwa " ; for ( var i = 0 ; i < 2 ; i++) yield i ; } /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ // U t w o r z e n i e o b i e k t u t y p u ” G e n e r a t o r ” var gen = generatorWarto ś ci ( ) ; /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ console . log ( gen . next ( ) ) ; console . log ( gen . next ( ) ) ; console . log ( gen . next ( ) ) ; console . log ( gen . next ( ) ) ; console . log ( gen . next ( ) ) ; Na wyjściu Object Object Object Object Object value: value: value: value: value: Dr inż. Stanisław Polak JavaScript — zagadnienia zaawansowane Na wyjściu Object value: "Stanisław", done: false Object value: "Polak", done: false Object value: undefined, done: true "Stanisław" "Polak" 126 Inne zagadnienia Wyrażenia tablicowe Wiele generatorów Pojedynczy generator 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function IterujPrzez ( . . . args ) { let index = 0 ; let iterable = { [ Symbol . iterator ] ( ) {// P r o t o k ó ł ’ i t e r a b l e ’ return this ; }, next ( ) { // P r o t o k ó ł ’ i t e r a t o r ’ if ( index < args . length ) { return { value : args [ index ++], // w y s t ą p i e n i e wymagane done : false // w y s t ą p i e n i e niewymagane }; } else { return { value : undefined , // w y s t ą p i e n i e niewymagane done : true // w y s t ą p i e n i e wymagane }; } } // n e x t ( ) }; return iterable ; } var iter = IterujPrzez ( ’ Stanis ł aw ’ , ’ Polak ’ ) ; console . log ( iter . next ( ) ) ; console . log ( iter . next ( ) ) ; console . log ( iter . next ( ) ) ; for ( var element of IterujPrzez ( ’ Stanis ł aw ’ , ’ Polak ’ ) ) console . log ( element ) ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function∗ nast ę p n yGe nera tor War to ś ci ( i ) { yield i + 1 ; yield i + 2 ; } function∗ gene ratorWarto ś ci ( i ) { yield i ; yield* nast ę pn y Ge n er ator War to ś ci ( i ) ; yield i + 1 ; } var gen = gene ratorWarto ś ci ( 1 ) ; console . log ( gen . next ( ) ) ; console . log ( gen . next ( ) ) ; console . log ( gen . next ( ) ) ; console . log ( gen . next ( ) ) ; console . log ( gen . next ( ) ) ; Object Object Object Object Object 127 { { { { { value: value: value: value: value: 8 9 10 11 12 13 14 15 16 Na wyjściu "Jeden", done: false "Dwa", done: false 0, done: false 1, done: false undefined, done: true 1 2 3 4 5 6 7 var litery = [ " A " , " B " , " C " ] ; var liczby = [ 1 , 2 , 3 ] ; /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ var kwadraty = [ for ( liczba of liczby ) liczba∗liczba ] ; console . log ( kwadraty ) ; // W y p i s z e : A r r a y [ 1 , 4 , 9 ] /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ var k wa d r a t y P ar z ys ty c h = [ for ( liczba of liczby ) if ( liczba%2 == 0 ) liczba∗ liczba ] ; console . log ( k wa d r a t y P ar zy s ty c h ) ; // W y p i s z e : A r r a y [ 4 ] /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ var miks1 = [ for ( liczba of liczby ) for ( litera of litery ) liczba+litera ] ; console . log ( miks1 ) ; // W y p i s z e : A r r a y [ ”1A” , ”1B” , ”1C” , ”2A” , ”2B” , ”2C” , ”3A ” , ”3B” , ”3C” ] /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ var miks2 = [ for ( liczba of liczby ) if ( liczba > 1 ) [ for ( litera of litery ) liczba+litera ] ] ; console . log ( miks2 ) ; // W y p i s z e : A r r a y [ A r r a y [ 3 ] , A r r a y [ 3 ] ] console . log ( miks2 [ 0 ] ) ; // W y p i s z e : A r r a y [ ”2A” , ”2B” , ”2C” ] console . log ( miks2 [ 1 ] ) ; // W y p i s z e : A r r a y [ ”3A” , ”3B” , ”3C” ] 1, done: false } 2, done: false } 3, done: false } 2, done: false } undefined, done: true } Dr inż. Stanisław Polak 128 Inne zagadnienia JavaScript — zagadnienia zaawansowane Obietnice I Reprezentują / Przechowują wyniki operacji asynchronicznej1 , np. zapytania AJAX I Wyniki operacji mogą nie być jeszcze dostępne, ale kiedyś będą I Obietnice można ze sobą składać IE T var litery = [ " A " , " B " , " C " ] ; var liczby = [ 1 , 2 , 3 ] ; /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ var generator = ( for ( liczba of liczby ) liczba∗liczba ) ; console . log ( generator ) ; // W y p i s z e : G e n e r a t o r { } console . log ( generator . next ( ) ) ; // W y p i s z e : O b j e c t { v a l u e : 1 , done : f a l s e } console . log ( generator . next ( ) ) ; // W y p i s z e : O b j e c t { v a l u e : 4 , done : f a l s e } console . log ( generator . next ( ) ) ; // W y p i s z e : O b j e c t { v a l u e : 9 , done : f a l s e } console . log ( generator . next ( ) ) ; // W y p i s z e : O b j e c t { v a l u e : u n d e f i n e d , done : t r u e } var generator = ( for ( liczba of liczby ) liczba∗liczba ) ; for ( var elem of generator ) console . log ( elem ) ; /∗ W y p i s z e : 1 4 9 ∗/ /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ generator =(for ( liczba of liczby ) if ( liczba > 1 ) [ for ( litera of litery ) liczba+ litera ] ) ; 19 console . log ( generator . next ( ) ) ; // W y p i s z e : O b j e c t { v a l u e : A r r a y [ 3 ] , done : f a l s e } 20 console . log ( generator . next ( ) ) ; // W y p i s z e : O b j e c t { v a l u e : A r r a y [ 3 ] , done : f a l s e } 21 console . log ( generator . next ( ) ) ; // W y p i s z e : O b j e c t { v a l u e : u n d e f i n e d , done : t r u e } Stany obietnic W oczekiwaniu (ang. pending) I Spełniona (ang. fulfilled) I Odrzucona (ang. rejected) I Rozstrzygnięta (ang. settled) dl a st ud en tó w In fo rm I at yk iw yd zia łu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 AG H w K Wyrażenia generujące Inne zagadnienia ra ko wi e JavaScript — zagadnienia zaawansowane ły Wartość zwracaną (w przypadku sukcesu) lub błąd (w razie porażki) er Dr inż. Stanisław Polak 129 130 M at Dr inż. Stanisław Polak ia 1 JavaScript — zagadnienia zaawansowane Inne zagadnienia JavaScript — zagadnienia zaawansowane Obietnice Inne zagadnienia Pośrednicy Przykład użycia 1 /∗∗∗ T w o r z e n i e o b i e t n i c y ∗∗∗/ 2 var obietnica1 = new Promise ( function ( resolve , reject ) { 3 // o b l i c z e n i a wykonywane a s y n c h r o n i c z n i e 4 setTimeout ( function ( ) { 5 var dzielnik = Math . floor ( Math . random ( ) ∗ 3 ) ; 6 if ( dzielnik != 0 ) 7 resolve ( 1 0 / dzielnik ) ; // Spe ł n i j o b i e t n i c ę 8 else 9 reject ( " Pr ó ba dzielenia przez 0 " ) ; // Odrzu ć o b i e t n i c ę 10 }, 2000) ; 11 }) ; 12 /∗∗∗ Uż y c i e o b i e t n i c y ∗∗∗/ 13 var obietnica2 = obietnica1 . then ( function ( result ) { 14 console . log ( ’ Wynik dzielenia : ’ , result ) ; 15 }) . catch ( function ( error ) { 16 console . log ( ’ Pojawi ł si ę b ł ą d ! ’ , error ) ; 17 }) ; Na wyjściu "Wynik dzielenia:" 5 Na wyjściu "Pojawił się błąd!" "Próba dzielenia przez 0" Rozstrzygnięta .then(onFulfillment) W oczekiwaniu (pending) Spełnienie Obietnica Odrzucenie 1 2 3 4 5 6 7 8 9 10 11 12 var proceduraObs ł ugi = { deleteProperty ( obiektDocelowy , w ł asno ś ć ) { console . log ( " Kasowanie w ł asno ś ci ’"+w ł asno ś ć+" ’" ) ; return delete obiektD ocelowy [ w ł asno ś ć ] ; // Zwraca : t r u e l u b f a l s e // l u b // r e t u r n R e f l e c t . d e l e t e P r o p e r t y ( o b i e k t D o c e l o w y , w ł a s n o ś ć ) ; } } var p = new Proxy({} , proceduraObs ł ugi ) ; p . a =1; delete p . a ; // W y p i s z e : ” K a s o w a n i e w ł a s n o ś c i ’ a ’ ” console . log ( p . a ) ; // W y p i s z e : u n d e f i n e d Akcje asynchroniczne W oczekiwaniu (pending) Zwraca Obietnica .then() ... .catch() Zwraca Rozstrzygnięta .then(onRejection) .catch(onRejection) Dr inż. Stanisław Polak Obsługa błędów 131 Dr inż. Stanisław Polak 132 JavaScript — zagadnienia zaawansowane Inne zagadnienia JavaScript — zagadnienia zaawansowane Pośrednicy Inne zagadnienia Wątki robocze Przykład zastosowania 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 var walidator = { set ( obiekt , w ł asno ś ć , warto ś ć ) { if ( w ł asno ś ć === ’ ilo ś ć ’ ) { if ( ! Number . isInteger ( warto ś ć ) ) { throw new TypeError ( ’ Ilo ś ć nie jest liczb ą ’ ) ; } if ( warto ś ć < 0 ) { throw new RangeError ( ’ Ilo ś ć nie mo ż e by ć liczb ą ujemn ą ’ ) ; } } I I I I I I I // Domyś l n e z a c h o w a n i e − z a p i s a n i e w a r t o ś c i obiekt [ w ł asno ś ć ] = warto ś ć ; return true ; // t r u e o z n a c z a , ż e uda ł o s i ę p r z y p i s a ć w a r t o ś ć I I } }; I 133 JavaScript — zagadnienia zaawansowane Obiekt ’navigator’ Obiekt ’location’ w trybie „tylko do odczytu” Obiekt ’XMLHttpRequest’ Metody setTimeout() / clearTimeout() oraz setInterval() / clearInterval() Cache’owanie aplikacji — Application Cache API Importowanie zewnętrznych skryptów za pomocą importScript() Tworzenie innych wątków potomnych Nie mają dostępu do: I var produkt = new Proxy ({} , walidator ) ; produkt . ilo ś ć = 1 0 ; console . log ( produkt . ilo ś ć ) ; // W y p i s z e : 10 produkt . ilo ś ć = ’ dziesi ę ć ’ ; // T y p e E r r o r : I l o ś ć n i e j e s t l i c z b ą produkt . ilo ś ć = −2; // R a n g e E r r o r : I l o ś ć n i e moż e by ć l i c z b ą ujemn ą Dr inż. Stanisław Polak Umożliwiają uruchamianie długotrwałych części skryptów JavaScript w osobnym wątku Mają dostęp do: I I I Obiekty DOM Obiekt ’window’ Obiekt ’document’ Obiekt ’parent’ Dr inż. Stanisław Polak Inne zagadnienia 134 JavaScript — zagadnienia zaawansowane Wątki robocze Obiekty Obiekty i własności Przykład 1 var worker = new Worker ( ’ worker . js ’ ) ; 2 worker . onmessage = function ( e ) { 3 console . log ( ’ Otrzymano odpowied ź od w ą tku roboczego :\ n ’ + e . data ) ; 4 }; 5 worker . postMessage ( ’ Witaj w ą tku roboczy ’ ) ; 6 worker . postMessage ( ’ Witaj w ą tku roboczy ’ ) ; 7 ... 8 worker . terminate ( ) ; 1 i = 0; 2 onmessage = function ( e ) { 3 i++; 4 odpowied ź =’\ ti = ’+i+’ , otrzymano odpowied ź od w ą tku g ł ó wnego : ’+e . data ; 5 postMessage ( odpowied ź ) ; 6 if ( i==3) 7 close ( ) ; 8 }; master.js worker.js I Obiekt — konstrukcja z własnościami I Własność — zmienna, inny obiekt lub funkcja I Obiekty definiowane przez przeglądarkę + własne obiekty Na wyjściu Otrzymano odpowiedź od wątku roboczego: i=1, otrzymano odpowiedź od wątku głównego: Witaj wątku roboczy Otrzymano odpowiedź od wątku roboczego: i=2, otrzymano odpowiedź od wątku głównego: Witaj wątku roboczy Dr inż. Stanisław Polak 135 Dr inż. Stanisław Polak 136 JavaScript — zagadnienia zaawansowane Obiekty Język oparty na prototypach kontra język oparty na klasach Język obiektowy oparty na klasach (Java) I Klasy i instancje są różnymi bytami (podmiotami) I I I Definiowanie klasy za pomocą definicji klasy; tworzenie instancji klasy za pomocą metod konstruktora Tworzenie pojedynczego obiektu za pomocą operatora ’new’. Tworzenie hierarchii obiektów za pomocą definicji klas w celu zdefiniowania podklas istniejących klas I Dziedziczenie własności poprzez podążanie za łańcuchem klas I Definicja klasy określa wszystkie właściwości wszystkich instancji klasy. Nie można dodać nowych właściwości, dynamicznie, w czasie wykonywania Dr inż. Stanisław Polak JavaScript — zagadnienia zaawansowane Obiekty Tworzenie obiektów Język obiektowy oparty na prototypach (JavaScript) I Wszystkie obiekty są instancjami I Definiowanie i tworzenie zestawu obiektów za pomocą funkcji konstruktora I Podobnie I Tworzenie hierarchii obiektów poprzez przypisanie obiektu jako prototypu związanego z funkcją konstruktora I Dziedziczenie własności poprzez podążanie za łańcuchem prototypów I Funkcja konstruktora lub prototypu określa początkowy zestaw właściwości. Można dodawać i usuwać właściwości dynamicznie do poszczególnych obiektów lub do całego zestawu obiektów 137 Tworzenie za pomocą inicjalizatora obiektu auto1 = new Auto ( " BMW " , " 520 " , 2 0 0 3 ) ; auto2 = new Auto ( " Fiat " , " Siena " , 1 9 9 8 ) ; Tworzenie przy użyciu funkcji konstruktora Dr inż. Stanisław Polak Obiekty function Auto ( marka , model , rocznik ) { this . marka=marka ; this . model=model ; this . rocznik=rocznik ; } 138 JavaScript — zagadnienia zaawansowane Obiekty Definiowanie metod T AG H w K function Auto ( marka , model , rocznik ) { this . marka=marka ; this . model=model ; this . rocznik=rocznik ; this . wyswietl=wyswietl } iw auto=new Auto ( " BMW " , " 520 " ) ; auto . wyswietl ( ) ; //Wyś w i e t l i : BMW 520 auto [ ’ wyswietl ’ ] ( ) ; //Wyś w i e t l i : BMW 520 yd zia łu IE function wyswietl ( ) { console . log ( this . marka+" " ) ; console . log ( this . model ) ; } at yk 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 tó w In function dlugosc ( ) { return ’D ł ugo ś ć napisu ’+ this+" wynosi "+this . length ; } ud en var napis=’ abc ’ ; String . prototype . dlugosc=dlugosc ; console . log ( napis . length ) ; // w y p i s z e : 3 console . log ( napis . dlugosc ( ) ) ; // w y p i s z e : Dł ugo ś ć n a p i s u abc w y n o s i 3 st 1 2 3 4 5 6 7 8 fo rm Definiowanie metody dla typu własnego Definiowanie nowej (własnej) metody dla typu wbudowanego Dr inż. Stanisław Polak er 139 at Dr inż. Stanisław Polak ia ł y 1 function Auto ( marka , model , rocznik ){ 2 this . marka=marka ; 3 this . model=model ; 4 this . rocznik=rocznik ; 5 } 6 7 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 8 function Osoba ( nazwa , wiek , plec ){ 9 this . nazwa=nazwa ; 10 this . wiek=wiek ; 11 this . plec=plec ; 12 this . constructor . krotnosc++; 13 } 14 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 15 var auto1 = new Auto ( " BMW " , " 520 " , 2 0 0 3 ) ; 16 var auto2 = new Auto ( " Fiat " , " Siena " , 1 9 9 8 ) ; 17 18 auto1 . kolor = " czerwony " ; 19 console . log ( auto1 . kolor ) ; // W y p i s z e : c z e r w o n y 20 console . log ( auto2 . kolor ) ; // W y p i s z e : u n d e f i n e d 21 22 /∗w ł a s n o ś ć ’ p r o t o t y p e ’ t o w ł a s n o ś ć d o s t ę pna w o b i e k t a c h : O b j e c t , A r r a y , S t r i n g , Number , Date , F u n c t i o n , RegExp o r a z B o o l e a n 23 ∗/ 24 console . log ( Auto . prototype ) ; // w y p i s z e : [ o b j e c t O b j e c t ] 25 console . log ( Auto . prototype . constructor ) ; // w y p i s z e : f u n c t i o n Auto ( marka , model , r o c z n i k ){ t h i s . marka=marka ; t h i s . model=model ; t h i s . r o c z n i k=r o c z n i k ; } 26 27 Auto . prototype . pojemnosc = null ; 28 auto2 . pojemnosc = 1 5 8 0 ; 29 console . log ( auto1 . pojemnosc ) ; // W y p i s z e : n u l l 30 console . log ( auto2 . pojemnosc ) ; // W y p i s z e : 1580 31 32 Osoba . krotnosc =0; //w ł a s n o ś ć s t a t y c z n a 33 var jk = new Osoba ( " Jan Kowalski " , 3 3 , " M " ) ; 34 auto1 . wlasciciel = jk ; 35 console . log ( auto1 . wlasciciel . nazwa ) ; // W y p i s z e : Jan K o w a l s k i 36 console . log ( Osoba . krotnosc ) ; // w y p i s z e : 1 dl a Własności i ich tworzenie ra ko wi e JavaScript — zagadnienia zaawansowane 1 2 3 4 5 6 7 8 1 var auto1 = {marka : " BMW " , model : " 520 " , rocznik : 2 0 0 3 } ; 2 var auto2 = {marka : " Fiat " , model : " Siena " , rocznik : 1 9 9 8 } ; 140 JavaScript — zagadnienia zaawansowane Obiekty Definiowanie metod pobierających oraz ustawiających 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 3 var obj = {wlasnosc : 1}; console . log ( JSON . stringify ( Object.getOwnPropertyDescriptor ( obj , " wlasnosc " ) ) ); //Wyś w i e t l i : {”value”:1, ”writable”:true, enumerable”:true, , ćonfigurable”:true} 4 5 var x = {}; 6 Object.defineProperty ( x , " wlasnosc1 " , { 7 writable : true , // b ę d z i e moż na u s t a w i ć warto ś ć 8 enumerable : true , // b ę d z i e w i d a ć w f o r−i n , in 9 configurable : true , // b ę d z i e moż na z m i e n i ć deskryptor 10 value : 42 11 }) ; 12 console . log ( x . wlasnosc1 ) ; // Wyś w i e t l i : 42 13 Object.defineProperty ( x , " wlasnosc2 " ,{ 14 value : 1 15 }) ; 16 console . log ( JSON . stringify ( Object . g e t O w n P r o p e r t y D e s c r i p t o r ( x , " wlasnosc2 " ) ) ); 17 //Wyś w i e t l i : {” v a l u e ” : 1 , ” w r i t a b l e ” : f a l s e , ” enumerable ”: f a l s e ,” c o n f i g u r a b l e ”: f a l s e} o . d =10; console . log ( o . d ) ; // W y p i s z e : 19 Dr inż. Stanisław Polak 141 JavaScript — zagadnienia zaawansowane Obiekty Ograniczanie możliwości modyfikacji obiektów Obiekty Deskryptory własności 1 2 var o = { a: 7, get b ( ) { return this . a + 1 ; } , set c ( x ) { this . a = x / 2 ; } }; console . log ( o . a ) ; // W y p i s z e : 7 console . log ( o . b ) ; // W y p i s z e : 8 o . c = 50; console . log ( o . a ) ; // W y p i s z e : 25 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ Object . defineProperty ( o , ’d ’ ,{ get : function ( ) { return this . a − 1 ; } , set : function ( x ) { this . a = x ∗ 2 } }) ; Dr inż. Stanisław Polak JavaScript — zagadnienia zaawansowane JavaScript — zagadnienia zaawansowane 1 var obj = { _x : 5 , y : " abc " }; 2 Object.defineProperties ( obj , { 3 x : { 4 enumerable : false , 5 configurable : true , 6 get : function ( ) { 7 return this . _x ; 8 }, 9 set : function ( nowaWartosc ) { 10 if ( nowaWartosc < 1 0 ) { 11 this . _x = nowaWartosc ; 12 } else { 13 this . _x = −1; 14 } 15 } 16 }, 17 y : { 18 enumerable : false 19 }, 20 z : { 21 enumerable : true 22 } 23 }) ; 24 25 obj . x =1; 26 console . log ( obj . x ) ; // Wyś w i e t l i : 1 27 obj . x =10; 28 console . log ( obj . x ) ; // Wyś w i e t l i : −1 29 obj . y =10; 30 console . log ( obj . y ) ; // Wyś w i e t l i : 10 31 for ( licznik in obj ) 32 console . log ( licznik ) ; /∗ Wyś w i e t l i : 33 x 34 z ∗/ 142 Obiekty Tworzenie hierarchii obiektów Prosty przykład 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 " use strict " ; var obj = { a: 5, b: 7 }; Object . pr ev e nt Ex te n si o n s ( obj ) ; obj . a = 3 1 3 3 7 ; // zmia na w a r t o ś c i : z a d z i a ł a delete obj . b ; // u s u n i ę c i e w ł a s n o ś c i : z a d z i a ł o obj . c = 4 2 ; // d o d a n i e w ł a s n o ś c i : s i l e n t f a i l u r e ; w s t r i c t : T y p e E r r o r Object . seal ( obj ) ; obj . a = 3 1 3 3 7 ; // zm ia na w a r t o ś c i : z a d z i a ł a delete obj . b ; // u s u n i ę c i e w ł a s n o ś c i : s i l e n t f a i l u r e ; w s t r i c t : T y p e E r r o r obj . c = 8 ; // d o d a n i e w ł a s n o ś c i : s i l e n t f a i l u r e ; w s t r i c t : T y p e E r r o r Object . freeze ( obj ) ; obj . a = 3 1 3 3 7 ; // zm ia na w a r t o ś c i : s i l e n t f a i l u r e ; w s t r i c t : T y p e E r r o r delete obj . b ; // u s u n i ę c i e w ł a s n o ś c i : s i l e n t f a i l u r e ; w s t r i c t : T y p e E r r o r obj . c = 8 ; // d o d a n i e w ł a s n o ś c i : s i l e n t f a i l u r e ; w s t r i c t : T y p e E r r o r Dr inż. Stanisław Polak 143 Dr inż. Stanisław Polak 144 Tworzenie hierarchii JavaScript — zagadnienia zaawansowane Obiekty Tworzenie hierarchii JavaScript — zagadnienia zaawansowane Obiekty Tworzenie hierarchii obiektów Alternatywny sposób tworzenia hierarchii obiektów Trochę bardziej złożony przykład ECMAScript 5 1 function Osoba ( ) { 2 this . imie = null ; 3 this . nazwisko = null ; 4 this . metoda = function ( ) { 5 return " Jestem metod ą " ; 6 } 7 } 8 function Pracownik ( ) { 9 this . id = null ; 10 } 11 Pracownik . prototype = new Osoba ( ) ; 12 13 var pracownik = new Pracownik ( ) ; 14 pracownik . imie = " Stanis ł aw " ; 15 pracownik . nazwisko = " Polak " ; 16 pracownik . id = 1 ; 17 console . log ( pracownik . id ) ; // W y p i s z e : 1 18 console . log ( pracownik . nazwisko ) ; // W y p i s z e : Polak 19 console . log ( pracownik . metoda ( ) ) ; // W y p i s z e : J e s t e m metod ą Stary sposób 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Tworzenie hierarchii var Osoba = { imie : null , nazwisko : null , metoda : function ( ) { return " Jestem metod ą " ; } }; // , , P o d k l a s a ’ ’ k l a s y Osoba var Pracownik = Object . create ( Osoba , { id : { // i d p r a c o w n i k a value : null , enumerable : true , configurable : true , writable : true } }) ; var pracownik = Object . create ( Pracownik ) ; pracownik . imie = " Stanis ł aw " ; pracownik . nazwisko = " Polak " ; pracownik . id = 1 ; console . log ( pracownik . id ) ; // W y p i s z e : 1 console . log ( pracownik . nazwisko ) ; // W y p i s z e : Polak console . log ( pracownik . metoda ( ) ) ; // W y p i s z e : J e s t e m metod ą Nowy sposób Dr inż. Stanisław Polak JavaScript — zagadnienia zaawansowane 145 Obiekty Alternatywny sposób tworzenia hierarchii obiektów Dr inż. Stanisław Polak Tworzenie hierarchii 146 Podstawy języka TypeScript Ogólna charakterystyka ECMAScript 6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ’ use strict ’ ; //Wł ą c z e n i e t r y b u ś c i s ł ego class Osoba { constructor ( imie , nazwisko ) { this . imie = imie ; this . nazwisko = nazwisko ; } I Nadzbiór języka JavaScript I I metodaZwyk ł a ( ) { return " Jestem metod ą instancyjn ą " ; } I I I static me toda Sta tycz na ( ) { return " Jestem metod ą statyczn ą " ; } } class Pracownik extends Osoba { constructor ( id , imie , nazwisko ) { super ( imie , nazwisko ) ; this . id = id ; } } Opcjonalne statyczne typowanie Programowanie zorientowane obiektowo oparte na klasach Moduły Interfejsy Opracowany przez firmę Microsoft I Kompilowany do JavaScript I Używany, m.in., w AngularJS wersja 2.x+ Jak zdobyć kompilator I I I Pakiet Node.js $ npm install -g typescript Wtyczka dla Visual Studio var pracownik = new Pracownik ( 1 , " Stanis ł aw " , " Polak " ) ; console . log ( pracownik . id ) ; // 1 console . log ( pracownik . imie ) ; // S t a n i s ł aw console . log ( pracownik . nazwisko ) ; // P o l a k console . log ( pracownik . metodaZwyk ł a ( ) ) ; // J e s t e m metod ą i n s t a n c y j n ą console . log ( Pracownik . met oda Statycz na ( ) ) ; // J e s t e m metod ą s t a t y c z n ą Dr inż. Stanisław Polak 147 Dr inż. Stanisław Polak 148 Podstawy języka TypeScript Przykład „Hello World” ra ko wi e Podstawy języka TypeScript Obsługa błędów K Błąd składniowy AG H Błąd typowania skrypt.ts $ tsc skrypt.ts #generuj kod ES3 $ tsc --target ES5 skrypt.ts #generuj kod ES5 Kompilacja $ node skrypt.js Witaj Świecie $ tsc skrypt.ts skrypt.ts(1,5): error TS2322: Type ’string’ is not assignable to type ’boolean’. 1 console . log ( " Witaj Ś wiecie " ) ; $ tsc skrypt.ts skrypt.ts(1,5): error TS1134: Variable declaration expected. skrypt.ts(1,8): error TS1005: ’(’ expected. skrypt.ts(1,11): error TS1005: ’)’ expected. skrypt.ts(2,13): error TS1135: Argument expression expected. skrypt.ts(2,15): error TS1005: ’(’ expected. In fo rm skrypt.js at yk iw yd zia łu Kompilacja skrypt.ts Kompilacja i uruchamianie en tó w 1 let ż ywy = ’ abc ’ ; 2 console . log ( ż ywy ) ; 1 2 3 4 5 6 let ; if ( = 2 ) ; console . log ( ) ; if ( ) ; a st ud skrypt.js IE T skrypt.ts 1 let ż ywy : boolean = ’ abc ’ ; 2 console . log ( ż ywy ) ; 1 console . log ( " Witaj Ś wiecie " ) ; w 1 let if = 2 ; 2 console . log ( if ) ; 149 Dr inż. Stanisław Polak 150 M at Dr inż. Stanisław Polak er ia ły dl skrypt.js Podstawy języka TypeScript Podstawy języka TypeScript Deklarownie typu zmiennej 1 2 3 4 5 6 let ż ywy : boolean = true ; let wiek : number = 4 8 ; let nazwisko : string = ’ Kowalski ’ ; let imiona:string[] = [ ’ Jan ’ , ’ Jerzy ’ ] ; let wiek_dzieci : Array<number> = [ 1 , 2 0 , 3]; 7 let wiek_rodzic ó w : Array<number> = [ 4 0 , " czterdzie ś ci jeden " ] ; // . . . Type ’ s t r i n g ’ i s not a s s i g n a b l e to type ’ number ’ . 8 9 let krotka : [string,number,boolean] ; 10 krotka = [ ’1 ’ , 2 , true ] ; 11 console . log ( krotka [ 2 ] ) ; // W y p i s z e : t r u e 12 krotka = [ ’1 ’ , 2 , true , 4 ] ; //OK 13 krotka = [ ’1 ’ , 2 ] ; // . . . Type ’ [ s t r i n g , number ] ’ i s n o t a s s i g n a b l e t o t y p e ’ [ s t r i n g , number , b o o l e a n ] ’ . . . . 14 krotka = [ 1 , 2 , 3 ] ; // . . . Type ’ [ number , number , number ] ’ i s n o t a s s i g n a b l e t o t y p e ’ [ s t r i n g , number , b o o l e a n ] ’. Dr inż. Stanisław Polak Typowanie 15 enum Oczy {Niebieskie , Zielone = 4 , Piwne , Br ą zowe } ; 16 let kolor_oczu = Oczy . Niebieskie ; 17 console . log ( Oczy [ 0 ] ) ; // W y p i s z e : Niebieskie 18 console . log ( Oczy [ 4 ] ) ; // W y p i s z e : Z i e l o n e 19 console . log ( Oczy [ 5 ] ) ; // W y p i s z e : Piwne 20 21 let cokolwiek : any = 4 ; 22 cokolwiek = " Napis " ; 23 cokolwiek = true ; 24 25 function wypisz ( komunikat ) : void { 26 console . log ( komunikat ) ; 27 } 28 29 function wyj ą tek ( komunikat ) : never { 30 throw new Error ( komunikat ) ; 31 } 32 33 function p ę tla ( ) : never { 34 while ( true ) {} 35 } 151 1 let napis : string ; 2 napis = 1 ; //B ł ąd , n i e moż na p o d s t a w i a ć l i c z b y pod z mi en n ą t y p u n a p i s o w e g o 3 4 let liczba = 1 ; 5 liczba = ’2 ’ ; //B ł ąd , n i e moż na p o d s t a w i a ć n a p i s u pod zm ienn ą t y p u liczbowego skrypt.ts 1 2 3 4 5 6 7 8 let napis : string ; napis = <any> 1 ; // T e r a z j e s t OK // l u b napis = 1 as any 1 ; let liczba = 1 ; liczba = <any>’2 ’ ; // T e r a z j e s t OK // l u b liczba = 2 as any’2 ’ ; // T e r a z j e s t OK skrypt.ts Kompilacja i uruchamianie $ tsc skrypt.ts skrypt.ts(2,1): error TS2322: Type ’number’ is not assignable to type ’string’. skrypt.ts(5,1): error TS2322: Type ’string’ is not assignable to type ’number’. Dr inż. Stanisław Polak Kompilacja i uruchamianie $ tsc skrypt.ts 152 Podstawy języka TypeScript Podstawy języka TypeScript Interfejsy Interfejsy Tworzenie typu złożonego Określanie typów funkcji interface Nazwa { imi ę : string ; // obowi ą zkowe nazwisko : string ; // obowi ą zkowe wiek ? : number ; // o p c j o n a l n y } /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ let u ż ytkownik : Nazwa ; /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ u ż ytkownik = { imi ę : ’ Jan ’ , nazwisko : ’ Kowalski ’ } /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ u ż ytkownik = { imi ę : ’ Jan ’ , nazwisko : ’ Kowalski ’ , wiek : ’ 40 ’ //B ł ą d : b ł ę dny t y p w a r t o ś c i } /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ u ż ytkownik = { //B ł ą d : n i e w y s p e c y f i k o w a n o ’ n a z w i s k o ’ imi ę : ’ Jan ’ } /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ u ż ytkownik = { imi ę : ’ Jan ’ , nazwisko : 3 4 5 , //B ł ą d : b ł ę dny t y p warto ś c i 28 wiek : ’ nastolatek ’ 29 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Dr inż. Stanisław Polak Kompilacja $ tsc skrypt.ts skrypt.ts(14,1): error TS2322: Type ’{ imię: string; nazwisko: string; wiek: string; }’ is not assignable to type ’Nazwa’. Types of property ’wiek’ are incompatible. Type ’string’ is not assignable to type ’number’. skrypt.ts(20,1): error TS2322: Type ’{ imię: string; }’ is not assignable to type ’Nazwa’. Property ’nazwisko’ is missing in type ’{ imię: string; }’. skrypt.ts(25,1): error TS2322: Type ’{ imię: string; nazwisko: number; wiek: string; }’ is not assignable to type ’Nazwa’. Types of property ’nazwisko’ are incompatible. Type ’number’ is not assignable to type ’string’. interface fu nkcjaNapisowa { ( param1 : string , param2 : string ) : string ; } /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ let dodajNapisy : funkcjaNapis owa ; let dodajLiczby : funkcjaNapis owa ; /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ dodajNapisy = function ( napis1 : string , napis2 : string ) { return napis1+napis2 ; } //OK dodajLiczby = function ( liczba1 : number , liczba2 : number ) { return liczba1 + liczba2 ; } /∗ . . . e r r o r TS2322 : Type ’ ( l i c z b a 1 : number , l i c z b a 2 : number ) => number ’ i s n o t a s s i g n a b l e to type ’ funkcjaNapisowa ’ . 16 Types o f p a r a m e t e r s ’ l i c z b a 1 ’ and ’ param1 ’ a r e i n c o m p a t i b l e . 17 Type ’ number ’ i s n o t a s s i g n a b l e t o t y p e ’ s t r i n g ’ . 18 19 ∗/ 20 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 21 dodajNapisy ( ’ Jan ’ , ’ Kowalski ’ ) ; //OK 22 dodajNapisy ( ’ Kowalski ’ ) ; // . . . e r r o r TS2346 : S u p p l i e d p a r a m e t e r s do n o t match any s i g n a t u r e o f c a l l t a r g e t . 23 dodajNapisy ( 1 , 2 ) ; // . . . e r r o r TS2345 : Argument o f t y p e ’ number ’ i s n o t a s s i g n a b l e to parameter of type ’ s t r i n g ’ . skrypt.ts 153 skrypt.ts 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Podstawy języka TypeScript Dr inż. Stanisław Polak Podstawy języka TypeScript Interfejsy Interfejsy Typy indeksowany Typy klasowe 1 2 3 4 5 6 7 154 interface haszNapis ó w { [ index : string ] : string ; } let parametry : haszNapis ó w ; parametry [ ’ serwer ’ ] = ’ HP ’ ; // OK let bar : number = parametry [ ’ serwer ’ ] ; // . . . e r r o r TS2322 : Type ’ s t r i n g ’ i s n o t a s s i g n a b l e t o t y p e ’ number ’ . 8 parametry [ ’ serwer ’ ] = 2 3 4 ; // . . . e r r o r TS2322 : Type ’ number ’ i s n o t a s s i g n a b l e to type ’ s t r i n g ’ . skrypt.ts 1 2 3 4 5 6 7 8 9 class Osoba { id : number ; } interface Walidator{ sprawd ź Unikalno ś ć ID ( s : number ) : boolean ; } class Pracownik extends Osoba implements Walidator {} skrypt.ts Na wyjściu skrypt.ts(9,7): error TS2420: Class ’Pracownik’ incorrectly implements interface ’Walidator’. Property ’sprawdźUnikalnośćID’ is missing in type ’Pracownik’. Dr inż. Stanisław Polak 155 Dr inż. Stanisław Polak 156 Podstawy języka TypeScript Podstawy języka TypeScript Klasy Klasy oraz typy generyczne Modyfikatory 1 class Osoba { 2 protected _id : number ; 3 readonly imi ę : string ; 4 readonly nazwisko : string = " Anonim " ; 5 6 get id ( ) : number { 7 return this . _id ; 8 } 9 10 set id ( warto ś ć : number ) { 11 this . _id = warto ś ć 12 } 13 14 constructor ( imi ę : string , nazwisko : string ) { 15 this . imi ę = imi ę ; 16 this . nazwisko = nazwisko ; 17 } 18 } 19 class Pracownik extends Osoba { 20 constructor ( id : number , imi ę : string , nazwisko : string ) { 21 super ( imi ę , nazwisko ) ; 22 this . id=id ; 23 } 24 } 25 26 let pracownik = new Pracownik ( 1 , " Stanis ł aw " , " Polak " ) ; 27 console . log ( pracownik . id ) ; // 1 28 console . log ( pracownik . _id ) ; // P r o p e r t y ’ i d ’ i s p r o t e c t e d and only a c c e s s i b l e within c l a s s ’ Osoba ’ and i t s s u b c l a s s e s . 29 console . log ( pracownik . imi ę ) ; // S t a n i s ł aw 30 console . log ( pracownik . nazwisko ) ; // P o l a k 31 pracownik . imi ę = " Jan " ; // . . . L e f t −hand s i d e of assignment expression c a n n o t be a c o n s t a n t o r a r e a d− only property . skrypt.ts Dr inż. Stanisław Polak 157 24 class MyApp { 25 constructor ( ) { 26 let myUsers = new Cus to m Co ll e c t io n<User> ( ) ; 27 let myMessages = new Cu s to mC o ll ec t i o n<Message> ( ) ; 28 29 let user : User = myUsers . GetFirst ( ) ; 30 // E r r o r b e c a u s e o f g e n e r i c t y p e v a l i d a t i o n 31 let message : Message = myUsers . GetFirst ( ) ; 32 // E r r o r b e c a u s e o f t h e G e n e r i c t y p e v a l i d a t i o n . 33 myUsers . Add ( new Message ( ) ) ; 34 } 35 } skrypt.ts Źródło: https://gist.github.com/abergs/5817818 Kompilacja i uruchamianie $ tsc skrypt.ts skrypt.ts(36,9): error TS2322: Type ’User’ is not assignable to type ’Message’. Property ’Message’ is missing in type ’User’. skrypt.ts(38,17): error TS2345: Argument of type ’Message’ is not assignable to parameter of type ’User’. Property ’Name’ is missing in type ’Message’. Dr inż. Stanisław Polak 158 Podstawy języka TypeScript Dekoratory ra ko wi e Podstawy języka TypeScript 1 class C u st o m Co l l e c t i o n <T> { 2 private itemArray : Array<T> ; 3 4 constructor ( ) { 5 this . itemArray = [ ] ; 6 } 7 8 Add ( item : T ) { 9 this . itemArray . push ( item ) ; 10 } 11 12 GetFirst ( ) : T { 13 return this . itemArray [ 0 ] ; 14 } 15 } 16 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 17 class User { 18 public Name ; 19 } 20 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 21 class Message { 22 public Message ; 23 } Przestrzenie nazewnicze oraz moduły method Można je zagnieżdżać — tworzenie hierarchii na podstawie mechanizmu zagnieżdżania przestrzeni nazw I Nie wymagają ładowacza modułów w AG H CommonJS require.js I Jeden moduł to jeden plik I Tworzenie hierarchii w oparciu o mechanizm zagnieżdżania katalogów y ia ł Dr inż. Stanisław Polak er 159 at Dr inż. Stanisław Polak I Wymagają deklaracji zależności (od innych modułów) dl a Źródło: https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md I I ud skrypt.ts I In I tó w { value: [Function], writable: true, enumerable: true, configurable: true } T Jedna przestrzeń może obejmować wiele plików IE I łu Umożliwiają zgrupowanie logicznie powiązanych obiektów i typów w zasięgu globalnym — nie trzeba ich importować Umożliwiają zgrupowanie logicznie powiązanych obiektów i typów we własnym zasięgu (zasięgu lokalnym) — aby z nich skorzystać należy je zaimportować Importowanie odbywa się w oparciu o ładowacz modułów: yd zia I Pozwalają na hermetyzację kodu I iw Pozwalają na hermetyzację kodu I at yk $ tsc --target ES5 --experimentalDecorators skrypt.ts && node skrypt.js f(): evaluated g(abc): evaluated g(abc): called f(): called C { method: [Function] } I fo rm Kompilacja i uruchamianie en function g ( value ) { console . log ( " g ( "+value+" ) : evaluated " ) ; return function ( target , propertyKey : string , descriptor : P r o p e r ty D es c r i pt o r ) { 16 console . log ( " g ( "+value+" ) : called " ) ; 17 } 18 } 19 20 class C { 21 @f() 22 @g(’abc’) 23 method ( ) {} 24 } Przestrzenie nazewnicze st 4 5 6 7 8 9 10 11 12 13 14 15 function f ( ) { console . log ( " f () : evaluated " ) ; return function ( target , propertyKey : string , descriptor : P r o p e r ty D e s c r i pt o r ) { console . log ( " f () : called " ) ; console . log ( target ) ; console . log ( ) ; console . log ( propertyKey ) ; console . log ( ) ; console . log ( descriptor ) ; } } K Moduły 1 2 3 160 Podstawy języka TypeScript Podstawy języka TypeScript Przestrzeń nazewnicza Przestrzeń nazewnicza Jednoplikowa Wieloplikowa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 namespace A { var a : string = ’ abc ’ ; export class Twix { constructor ( ) { console . log ( ’ Twix ’ ) ; } } 1 namespace A { 2 export class Twix { . . . } 3 } global1.ts export class Pean utB ut terCu p { constructor ( ) { console . log ( ’ Pea nutBu tter Cup ’ ) ; } } 1 namespace A { 2 export class P ea nu tB u tt er Cu p { . . . } 3 } global2.ts export class KitKat { constructor ( ) { console . log ( ’ KitKat ’ ) ; } } } let o1 = new A . Twix ( ) ; // W y p i s z e : Twix let o2 = new A . Pea nutButter Cup ( ) ; // Wypisze : PeanutButterCup 23 let o3 = new A . KitKat ( ) ; // W y p i s z e : KitKat 24 console . log ( A . a ) ; // . . . e r r o r TS2339 : P r o p e r t y ’ a ’ d o e s n o t e x i s t on type ’ typeof A ’ . // / // / // / let let let <r e f e r e n c e p a t h=” g l o b a l 1 . t s ” /> <r e f e r e n c e p a t h=” g l o b a l 2 . t s ” /> <r e f e r e n c e p a t h=” g l o b a l 3 . t s ” /> o1 = new A . Twix ( ) ; o2 = new A . P ea nu t Butt er C up ( ) ; o3 = new A . KitKat ( ) ; global3.ts Źródło: http: //stackoverflow.com/questions/30357634/ how-do-i-use-namespaces-with-typescript-external-modules skrypt.ts Kompilacja i uruchamianie $ tsc --outFile skrypt.js skrypt.ts && node skrypt.js Twix PeanutButterCup KitKat skrypt.ts Dr inż. Stanisław Polak 1 2 3 4 5 6 1 namespace A { 2 export class KitKat { . . . } 3 } 161 Podstawy języka TypeScript Dr inż. Stanisław Polak 162 Podstawy języka TypeScript Moduły zewnętrzne Moduły zewnętrzne Eksportowanie Importowanie 1 export class Twix { 2 constructor ( ) { 3 console . log ( ’ Twix ’ ) ; 4 } 5 } 6 export {Twix as Raider } ; 1 export class Twix { . . . } 2 export {Twix as Raider } ; Mod1.ts Mod1.ts 1 class PeanutBut ter Cup { 2 constructor ( ) { 3 console . log ( ’ P ea nutBu tterCup ’ ) ; 4 } 5 } 6 export {Pe a nu tBu tter Cup } ; 1 class Pe anutButte rCu p { . . . } 2 export {Pea nutBu tterCup } ; Mod2.ts Mod2.ts 1 export class KitKat { 2 constructor ( ) { 3 console . log ( ’ KitKat ’ ) ; 4 } 5 } 1 export class KitKat { . . . } Źródło: http: //stackoverflow.com/questions/30357634/ how-do-i-use-namespaces-with-typescript-external-modules 1 2 3 4 5 6 7 8 9 10 11 12 13 import import import import import {Twix , Raider} from ’ ./ Mod1 ’ ; {PeanutB utterCup} from ’ ./ Mod2 ’ ; {KitKat} from ’ ./ Mod3 ’ ; {KitKat as KitKatChunKy} from ’ ./ Mod3 ’ ; ∗ as Mars from ’ ./ Mod1 ’ ; let o1 = new Twix ( ) ; // W y p i s z e : Twix let o2 = new Raider ( ) ; // W y p i s z e : Twix let o3 = new P ea nutButterCu p ( ) ; // W y p i s z e : PeanutButterCup let o4 = new KitKat ( ) ; // W y p i s z e : K i t K a t let o5 = new KitKatChunKy ( ) ; // W y p i s z e : K i t K a t let o6 = new Mars . Twix ( ) ; // W y p i s z e : Twix let o7 = new Mars . Raider ( ) ; // W y p i s z e : Twix skrypt.ts Mod3.ts Mod3.ts Dr inż. Stanisław Polak 163 Dr inż. Stanisław Polak 164 Podstawy języka TypeScript Podstawy języka TypeScript Przestrzenie nazewnicze w modułach Moduły zewnętrzne Importowanie w stylu „NodeJS” 1 export namespace A { 2 export class Twix { . . . } 3 } Mod1.ts 1 export namespace A { 2 export class P ea nu tB u tt er Cu p { . . . } 3 } Mod2.ts 1 export namespace A { 2 export class KitKat { . . . } 3 } Mod3.ts Źródło: http://stackoverflow.com/questions/30357634/ how-do-i-use-namespaces-with-typescript-external-modules 1 class Twix { 2 constructor ( ) { 3 console . log ( ’ Twix ’ ) ; 4 } 5 } 6 export = Twix ; 1 import Twix = require ( ’ ./ Mod ’ ) ; 2 let o = new Twix ( ) ; skrypt.ts Mod.ts Dr inż. Stanisław Polak 165 Podstawy języka TypeScript Dr inż. Stanisław Polak 166 Podstawy języka TypeScript Tworzenie projektu Pliki deklaracji 1 function pole ( promie ń ) { 2 return Math . PI∗Math . pow ( promie ń , 2 ) ; 3 } 4 module . exports = pole ; 1 { 2 " compi le rOpt ion s " : { 3 " module " : " commonjs " , 4 " target " : " es5 " , 5 " noImplicitAny " : false , 6 " sourceMap " : false 7 }, 8 " files " : [ 9 " skrypt . ts " 10 ] 11 } 1 import pole = require ( ’ ./ pole ’ ) ; // do ł ą c z e n i e ’ pole . d . ts ’ 2 let promie ń = 2 ; 3 console . log ( ‘ Pole ko ł a o promieniu ${ promie ń} wynosi ${pole ( promie ń ) } ‘ ) ; pole.js 1 declare function pole ( promie ń : number ) : number ; 2 export = pole skrypt.ts pole.d.ts tsconfig.json Kompilacja projektu Przykłady użycia kompilatora $ tsc && node skrypt.js skrypt.ts(3,56): error TS2304: Cannot find name ’pole’. $ tsc --init $ tsc 1 2 3 4 " use strict " ; var pole = require ( " ./ pole " ) ; var promie ń = 2 ; console . log ( " Pole ko ł a o promieniu " + promie ń + " wynosi " + pole ( promie ń) ) ; skrypt.js Dr inż. Stanisław Polak 167 Dr inż. Stanisław Polak 168 AngularJS Podstawy Zalety i wady AngularJS I Umożliwia tworzenie aplikacji w oparciu o architekturę komponentową I Zgodność aplikacji AngulsJS z różnymi przeglądarkami I Pozwala używać HTML jako języka szablonów w AG H Zapewnia możliwość wiązania danych HTML, co wzbogaca doznania użytkownika serwisu Wady I Kod może być testowany w oparciu o mechanizm testów jednostkowych I Wykorzystuje wstrzykiwanie zależności oraz pozwala na korzystanie z separacji zagadnień I Zapewnia komponenty wielokrotnego użytku I Deweloperzy mogą osiągnąć większą funkcjonalność z krótszego kodu I Stworzone aplikacje nie są bezpieczne I Nie działa, gdy użytkownik wyłączy obsługę JS ia ły dl a st ud en tó w In Rozszerza HTML o dodatkowe atrybuty i znaczniki I IE T Wydajny, darmowy framework do tworzenia dynamicznych aplikacji WWW w języku TypeScript lub JavaScript Zapewnia możliwość tworzenia pojedynczej strony aplikacji w bardzo zgrabny oraz kontrolowany sposób at yk iw yd zia łu I I K Zalety Ogólna charakterystyka I Framework „AngularJS” ra ko wi e Podstawy fo rm Framework „AngularJS” 169 Dr inż. Stanisław Polak Framework „AngularJS” Podstawy Framework „AngularJS” 170 M at er Dr inż. Stanisław Polak Etapy tworzenia aplikacji Podstawy Architektura I Utworzenie szablonu zawierającego HTML ze wstawkami Angular, I Kreowanie komponentów do zarządzania tymi szablonami, I Dodanie logiki aplikacji w usługach (ang. services), I Tworzenie modułów, których zawartością są komponenty oraz usługi, I Przekazanie modułu głównego do funkcji uruchamiającej aplikację. Moduł Komponent {} Moduł Usługa {} Moduł wartość 3,1415 Moduł Fn λ Wstrzykiwacz Usługa ( ) . . Dr inż. Stanisław Polak . Komponent ( ) . ( ) . . ) . . . Dyrektywa {} Wiązanie zdarzenia Metadane . 171 Szablon < > Wiązanie własności ( Dr inż. Stanisław Polak Metadane . 172 . Framework „AngularJS” Aplikacja „Hello World” Framework „AngularJS” Generowanie szkieletu aplikacji Aplikacja „Hello World” Struktura projektu Ważniejsze pliki oraz katalogi hello angular-cli.json e2e src 1 2 3 4 $ npm install −g @angular / cli $ ng new hello cd hello $ ng serve app assets environments polyfills.ts tslint.json Dr inż. Stanisław Polak Framework „AngularJS” 173 Dr inż. Stanisław Polak Aplikacja „Hello World” Składniki Komponent oraz moduł 1 import { Component } from ’ @angular / core ’ ; 2 3 @Component({ 4 selector : ’app - root ’ , 5 templateUrl : ’ ./ app . component . html ’, 6 styleUrls : [ ’ ./ app . component . css ’ ] 7 }) 8 export class AppComponent { 9 title = ’ app works ! ’ ; 10 } src/app/app.component.ts 174 Framework „AngularJS” Aplikacja „Hello World” Plik główny 1 import { BrowserModule } from ’ @angular / platform - browser ’ ; 2 import { NgModule } from ’ @angular / core ’ ; 3 import { FormsModule } from ’ @angular / forms ’ ; 4 import { HttpModule } from ’ @angular / http ’ ; 5 6 import { AppComponent } from ’ ./ app . component ’ ; 7 8 @NgModule({ 9 declarations : [ AppComponent ] , 10 imports : [ BrowserModule , FormsModule , HttpModule ] , 11 providers : [ ] , 12 bootstrap : [ AppComponent ] 13 }) 14 export class AppModule { } 1 2 3 4 5 6 7 8 9 10 import import import import { { { { p l a t f o r m B r o w s e r D y n a m i c } from ’ @angular / platform - browser - dynamic ’ ; enableProdMode } from ’ @angular / core ’ ; environment } from ’ ./ environments / environment ’ ; AppModule } from ’ ./ app / app . module ’ ; if ( environment . production ) { enableProdMode ( ) ; } p l a t f o r m B r o w s e r D y n a m i c ( ) . boo ts tra pModule ( AppModule ) ; src/main.ts src/app/app.module.ts Dr inż. Stanisław Polak 175 Dr inż. Stanisław Polak 176 Składniki Framework „AngularJS” Aplikacja „Hello World” Składniki Szablon Framework „AngularJS” Aplikacja „Hello World” Testowanie aplikacji Środowiska do automatycznego testowania aplikacji 1 <h1>{{title}}</ h1> 1 ... 2 @Component ({ 3 selector : ’ app-root ’ , 4 ... 5 }) 6 export class AppComponent { 7 title = ’ app works ! ’ ; 8 } src/app/app.component.html Uruchamianie testów src/app/app.component.ts Tworzenie testów I Karma I Jasmine I Protractor I Mocha 1 <! doctype html> 2 <html> 3 <head> 4 <meta charset=" utf -8 "> 5 <title>Hello</ title> 6 <base href=" / "> 7 8 <meta name=" viewport " content=" width = device width , initial - scale =1 "> 9 <link rel=" icon " type=" image /x - icon " href=" favicon . ico "> 10 </ head> 11 <body> 12 <app-root> Loading . . . </app-root> 13 </ body> 14 </ html> src/index.html 177 Framework „AngularJS” Aplikacja „Hello World” Testowanie aplikacji Dr inż. Stanisław Polak 178 Framework „AngularJS” Aplikacja „Hello World” Testowanie aplikacji Środowisko do uruchamiania testów jednostkowych „Karma” Konfiguracja Testy w AG H yd zia iw at yk fo rm 180 IE T $ ng test ... 14 02 2017 1 5 : 2 6 : 3 2 . 7 5 4 : INFO [ karma ] : Karma v1 . 2 . 0 server started at http : / / localhost : 9 8 7 6 / 14 02 2017 1 5 : 2 6 : 3 2 . 7 5 4 : INFO [ launcher ] : Launching browser Firefox with unlimited concurrency 14 02 2017 1 5 : 2 6 : 3 2 . 7 6 0 : INFO [ launcher ] : Starting browser Firefox 14 02 2017 1 5 : 2 6 : 3 5 . 9 7 1 : INFO [ Firefox 5 1 . 0 . 0 ( Ubuntu 0 . 0 . 0 ) ] : Connected on socket /#6 UsGClgJqyaDAt3OAAAA w i t h i d 7158706 Firefox 5 1 . 0 . 0 ( Ubuntu 0 . 0 . 0 ) : Executed 3 of 3 SUCCESS ( 0 . 6 2 secs / 0 . 6 0 7 secs ) łu 1 2 3 4 5 6 In tó w en ud st dl a y Dr inż. Stanisław Polak ia ł Dr inż. Stanisław Polak src/app/app.component.spec.ts er karma.conf.js 1 ... 2 describe ( ’ AppComponent ’ , ( ) => { 3 beforeEach ( ( ) => { 4 TestBed . c o n f i g u r e T e s t i n g M o d u l e ({ 5 declarations : [ AppComponent ] , 6 }) ; 7 TestBed . c o m p i l eC o m p o n e n t s ( ) ; 8 }) ; 9 10 it ( ’ should create the app ’ , async ( ( ) => { 11 const fixture = TestBed . cr e at eC omp on en t ( AppComponent ) ; 12 const app = fixture . debugElement . c o m p o n e n t I n s t an c e ; 13 expect ( app ) . toBeTruthy ( ) ; 14 }) ) ; 15 16 it ( ‘ should have as title ’ app works ! ’ ‘ , async ( ( ) => { 17 const fixture = TestBed . cr e at eC omp on en t ( AppComponent ) ; 18 const app = fixture . debugElement . c o m p o n e n t I n s t an c e ; 19 expect ( app . title ) . toEqual ( ’ app works ! ’ ) ; 20 }) ) ; 21 22 it ( ’ should render title in a h1 tag ’ , async ( ( ) => { 23 const fixture = TestBed . cr e at eC omp on en t ( AppComponent ) ; 24 fixture . detectChanges ( ) ; 25 const compiled = fixture . debugElement . nativeElement ; 26 expect ( compiled . querySelector ( ’ h1 ’ ) . textContent ) . toContain ( ’ app works ! ’ ) ; 27 }) ) ; 28 }) ; at 1 // Karma c o n f i g u r a t i o n f i l e , s e e l i n k f o r more i n f o r m a t i o n 2 // h t t p s : / / karma−r u n n e r . g i t h u b . i o / 0 . 1 3 / c o n f i g / c o n f i g u r a t i o n −f i l e . h t m l 3 4 module . exports = function ( config ) { 5 config . set ({ 6 ... 7 frameworks : [ ’ jasmine ’ , ’ @angular / cli ’ ] , 8 plugins : [ 9 require ( ’ karma - jasmine ’ ) , 10 require ( ’ karma - chrome - launcher ’ ) , 11 ... 12 ], 13 files : [ 14 { pattern : ’ ./src/test.ts }}; ’ , watched : false } 15 ], 16 ... 17 }) ; 18 } ; 1 // T h i s f i l e i s r e q u i r e d by karma . c o n f . j s and l o a d s r e c u r s i v e l y a l l t h e . s p e c and f r a m e w o r k f i l e s 2 3 import ’ zone . js / dist / long - stack - trace zone ’ ; 4 ... 5 6 // U n f o r t u n a t e l y t h e r e ’ s no t y p i n g f o r the ‘ karma ‘ v a r i a b l e . Just d e c l a r e i t a s any . 7 declare var __karma__ : any ; 8 declare var require : any ; 9 10 // P r e v e n t Karma from r u n n i n g prematurely . 11 __karma__ . loaded = function ( ) {}; 12 13 // F i r s t , i n i t i a l i z e t h e A n g u l a r t e s t i n g environment . 14 getTestBed ( ) . i n i t T es t E n v i r o n me n t ( 15 BrowserDynamicTestingModule , 16 platformBrowserDynamicTesting ( ) 17 ) ; 18 // Then we f i n d a l l t h e t e s t s . 19 const context = require . context ( ’ ./ ’ , true , / \ . spec \ . ts$ / ) ; 20 // And l o a d t h e m o d u l e s . 21 context . keys ( ) . map ( context ) ; 22 // F i n a l l y , s t a r t Karma t o r u n t h e t e s t s . 179 23 __karma__ . start ( ) ; K Środowisko do uruchamiania testów jednostkowych „Karma” ra ko wi e Dr inż. Stanisław Polak 7 Uruchomienie testu Framework „AngularJS” Aplikacja „Hello World” Testowanie aplikacji Framework „AngularJS” Aplikacja „Hello World” Testowanie aplikacji Środowisko do uruchamiania testów e2e „Protractor” Środowisko do uruchamiania testów e2e „Protractor” Konfiguracja Test 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 // P r o t r a c t o r c o n f i g u r a t i o n f i l e , s e e l i n k f o r more i n f o r m a t i o n // h t t p s : / / g i t h u b . com/ a n g u l a r / p r o t r a c t o r / b l o b / m a s t e r / l i b / c o n f i g . t s /∗ g l o b a l j a s m i n e ∗/ var SpecReporter = require ( ’ jasmine - spec - reporter ’ ) ; exports . config = { a l l S c rip t s Ti m eo u t : 1 1 0 0 0 , specs : [ ’ ./ e2e /**/*. e2e - spec . ts ’ ] , capabilities : {’ browserName ’ : ’ chrome ’ } , directConnect : true , baseUrl : ’ http :// localhost :4200/ ’ , framework : ’ jasmine ’ , jasmineN od eOpt s : { showColors : true , defaultTimeoutInterval : 30000 , print : function ( ) {} }, u s e A l l A n g u l a r 2 A p p R o o t s : true , beforeLaunch : function ( ) { require ( ’ts - node ’ ) . register ({ project : ’ e2e ’ }) ; }, onPrepare : function ( ) { jasmine . getEnv ( ) . addReporter ( new SpecReporter ( ) ) ; } }; 11 12 13 14 import { HelloPage } from ’ ./ app . po ’ ; describe ( ’ hello App ’ , function ( ) { let page : HelloPage ; beforeEach ( ( ) => { page = new HelloPage ( ) ; }) ; 181 1 2 3 it ( ’ should display message saying app works ’ , ( ) => { page . navigateTo ( ) ; expect ( page . g e t P a r a g r a p h T e x t ( ) ) . toEqual ( ’ app works ! ’ ) ; }) ; }) ; 4 e2e/app.e2e-spec.ts 7 5 6 8 1 2 3 4 5 6 7 8 9 import { browser , element , by } from ’ protractor ’; export class HelloPage { navigateTo ( ) { return browser . get ( ’/ ’ ) ; } g e t P ar a g ra p h T e x t ( ) { return element ( by . css ( ’app - root h1 ’ ) ) . getText ( ) ; 10 } Dr inż. Stanisław Polak 11 } protractor.conf.js Dr inż. Stanisław Polak 1 2 3 4 5 6 7 8 9 10 9 10 11 12 13 14 15 16 $ ng e2e ... [ 1 6 : 3 8 : 2 9 ] I / update − chromedriver : file exists / home / polak / hello / node_modules / protractor / node_modules / webdriver−manager / selenium / chromedrive r_2 . 2 7 . zip [ 1 6 : 3 8 : 2 9 ] I / update − chromedriver : unzipping chromedrive r_2 . 2 7 . zip [ 1 6 : 3 8 : 3 0 ] I / update − chromedriver : setting permissions to 0755 for / home / polak / hello / node_modules / protractor / node_modules / webdriver−manager / selenium / chrom edriver_2 .27 [ 1 6 : 3 8 : 3 0 ] I / update − chromedriver : chromedrive r_2 . 2 7 up to date [ 1 6 : 3 8 : 3 0 ] I / launcher − Running 1 instances of WebDriver [ 1 6 : 3 8 : 3 0 ] I / direct − Using ChromeDriver directly . . . Spec started hello App should display message saying app works Executed 1 of 1 spec SUCCESS in 1 sec . [ 1 6 : 3 8 : 3 2 ] I / launcher − 0 instance ( s ) of WebDriver still running [ 1 6 : 3 8 : 3 2 ] I / launcher − chrome #01 p a s s e d Uruchomienie testu 182 e2e/app.po.ts Framework „AngularJS” Aplikacja „Sklep” Framework „AngularJS” Koncepcja aplikacji Generowanie plików szkieletowych Założenia Potrzebne składniki I Aplikacja ma wyświetlać listę produktów w postaci tabeli HTML I Adres strony z listą produktów: http://localhost: 4200/products I Produkty są przechowywane, w programie, w postaci tablicy obiektów I Klasa reprezentująca produkt I Usługa dostarczająca zawartość listy produktów I I I Moduł główny Komponenty: I I Strony mają być responsywne Dr inż. Stanisław Polak Aplikacja „Sklep” 183 główny wyświetlający listę produktów 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $ ng new shop $ cd shop $ ng generate class Product #Utwó r z s z k i e l e t k l a s y installing class create src / app / product . ts $ ng generate service Products #Utwó r z s z k i e l e t u s ł u g i installing service create src / app / products . service . spec . ts create src / app / products . service . ts WARNING Service is generated but not provided , it must be provided to be used $ ng generate component ProductsList #Utwó r z s z k i e l e t komponentu installing component create src / app / products−list / products−list . component . css create src / app / products−list / products−list . component . html create src / app / products−list / products−list . component . spec . ts create src / app / products−list / products−list . component . ts update src / app / app . module . ts Dr inż. Stanisław Polak 184 Framework „AngularJS” Aplikacja „Sklep” Framework „AngularJS” Niektóre z wygenerowanych plików szkieletowych 1 import { Injectable } from ’ @angular / core ’ ; 2 3 @Injectable ( ) 4 export class Pro du c ts Se rv i ce { 5 constructor ( ) { } 6 } src/app/products.service.ts 1 2 3 4 5 6 7 8 @Component ({ selector : ’app - products - list ’ , templateUrl : ’ ./ products - list . component . html ’ , styleUrls : [ ’ ./ products - list . component . css ’ ] }) export class P r o d u c t s L i s t C o m p o n e n t implements OnInit { 9 constructor ( ) { } 10 ngOnInit ( ) { } 11 } src/app/products-list/productslist.component.ts 1 <p>products−list works !</ p> Włączenie reponsywności 1 export class Product { 2 } src/app/product.ts 1 import { Component , OnInit } from ’ @angular / core ’ ; Aplikacja „Sklep” 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import { BrowserModule } from ’ @angular / platform browser ’ ; import { NgModule } from ’ @angular / core ’ ; import { FormsModule } from ’ @angular / forms ’ ; import { HttpModule } from ’ @angular / http ’ ; import { AppComponent } from ’ ./ app . component ’ ; import { P r o d u c t s L i s t C o m p o n e n t } from ’ ./ products list / products - list . component ’ ; @NgModule ({ declarations : [ AppComponent , ProductsListComponent ], imports : [ BrowserModule , FormsModule , HttpModule ], providers : [ ] , bootstrap : [ AppComponent ] }) export class AppModule { } 1 <! doctype html> 2 <html> 3 <head> 4 <meta charset=" utf -8 "> 5 <title>Shop</ title> 6 <base href=" / "> 7 <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/css/bootstrap.min.css"> 8 <meta name=" viewport " content=" width = device - width , initial - scale =1 "> 9 <link rel=" icon " type=" image /x - icon " href=" favicon . ico "> 10 </ head> 11 <body class=”container”> 12 <app−r o o t>Loading . . .</ app−r o o t> 13 </ body> 14 </ html> src/index.html src/app/app.module.ts src/app/products-list/productslist.component.html Dr inż. Stanisław Polak 185 Dr inż. Stanisław Polak 186 Framework „AngularJS” Aplikacja „Sklep” Framework „AngularJS” Aplikacja „Sklep” Klasa reprezentująca produkt Implementacja usługi dostarczenia listy produktów 1 export class Product { 2 id : number ; 3 name : string = ’ ’ ; 4 description : string = ’ ’ ; 5 price : number ; 6 } src/app/product.ts 1 import { Injectable } from ’ @angular / core ’ ; 2 import { Product } from ’ ./ product ’ ; 3 4 const PRODUCTS : Product [ ] = [ 5 { 6 id : 1 , 7 name : ’ spadochron ’ , 8 description : ’ Rewelacyjny spadochron dla nurk ó w ! Znakomicie zapobiega zderzeniu si ę z dnem ’ , 9 price : 2 5 0 . 9 9 10 }, 11 { 12 id : 2 , 13 name : ’ wanna ’ , 14 description : ’ Dzi ę ki wbudowanym drzwiom ju ż wi ę cej nie po ś li ź niesz si ę wychodz ą c z wanny ’ , 15 price : 5 9 9 . 8 0 16 }, 17 ] ; 18 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ 19 @Injectable() 20 export class Pro du ctsService { 21 getProducts() : Product [ ] { 22 return PRODUCTS ; 23 } 24 } src/app/products.service.ts Dr inż. Stanisław Polak 187 Dr inż. Stanisław Polak 188 Aplikacja „Sklep” Framework „AngularJS” Aplikacja „Sklep” ra ko wi e Framework „AngularJS” Wyświetlanie listy produktów 1 ... 2 import { Produ ct s Se rvice } from ’ ../ products . service ’ ; 3 import { Product } from ’ ../ product ’ ; 4 ... 5 export class P r o d u c t s L i s t C o m p o n e n t implements OnInit { 6 products : Product [ ] ; 7 8 // W s t r z y k i w a n i e u s ł u g i ’ P r o d u c t s S e r v i c e ’ − po w s t r z y k n i e c i u , u s ł uga b ę d z i e d o s t ę pna z a pomoc ą wyra ż e n i a ’ this . productsService ’ 9 constructor ( private pr oduct sS ervice : ProductsService ) {} 10 11 ngOnInit ( ) : void { 12 this . products = this.productsService . getProducts ( ) ; 13 } 14 } 1 <table class=" table "> 2 <tr> 3 <th>Nazwa</ th> 4 <th>Opis</ th> 5 <th>Cena</ th> 6 </ tr> 7 <template ngFor l e t −p r o d u c t [ ngForOf ]=" products "> 8 <!−− p o w i e l a n y w i e r s z t a b e l i −−> 9 <tr> 10 <td>{{product.name}}</ td> 11 <td>{{product.description}}</ td> 12 <td>{{product.price}}</ td> 13 </ tr> 14 </template> 15 </ table> IE T at yk iw yd zia łu 1 <table class=" table "> 2 <tr> 3 <th>Nazwa</ th> 4 <th>Opis</ th> 5 <th>Cena</ th> 6 </ tr> 7 <tr *ngFor=" let product of products "> 8 <td>{{product . name}}</ td> 9 <td>{{product . description}}</ td> 10 <td>{{product . price}}</ td> 11 </ tr> 12 </ table> fo rm en tó w src/app/app.module.ts In 1 ... 2 import { Product sSe rvice } from ’ ./ products . service ’ ; 3 4 @NgModule ({ 5 ... 6 providers : [ ProductsService ] , 7 ... 8 }) 9 ... AG H w K Wstrzykiwanie usługi ud src/app/products-list/productslist.component.html st src/app/products-list/productslist.component.ts 189 Framework „AngularJS” Aplikacja „Sklep” Dr inż. Stanisław Polak 190 M at Dr inż. Stanisław Polak er ia ły dl a src/app/products-list/productslist.component.html Trasowanie Literatura Źródła Źródła I 1 ... 2 import { RouterModule } from ’ @angular / router ’ ; 3 ... 4 @NgModule ({ 5 ... 6 imports : [ 7 BrowserModule , 8 FormsModule , 9 HttpModule , 10 RouterModule . forRoot ( [ 11 { path: ’products’, component: ProductsListComponent } 12 ]) 13 ], 14 ... 15 }) 16 . . . I Thomas Fuchs. Scriptaculous Documentation. http://madrobby.github.com/scriptaculous/. I Paweł Grzesiak. Ajax w kilka minut. http://internetmaker.pl/artykul/723,1,ajax_w_kilka_minut.html. I Patrick Hunlock. Functional Javascript. http://www.hunlock.com/blogs/Functional_Javascript. I MongoDB Inc. The MongoDB Manual. http://docs.mongodb.org/manual/. I Joyent. Node.js Manual & Documentation. http://nodejs.org/api/. src/app/app.module.ts 1 2 3 4 5 <h1>{{title}}</ h1> <nav> <a routerLink=" / products ">Products</ a> </ nav> <router-outlet></router-outlet> Dr inż. Stanisław Polak src/app/app.component.html 191 Dr inż. Stanisław Polak 192 Literatura Źródła Literatura Źródła II Źródła III I jQuery Project. jQuery API. http://api.jquery.com/. I Microsoft. Typescript handbook. http://www.typescriptlang.org/Handbook. I Mozilla. AJAX. https://developer.mozilla.org/pl/AJAX. I mozilla.org. JavaScript Guide. https://developer.mozilla.org/en/JavaScript/Guide. I Valerio Proietti. MooTools API Documentation. http://mootools.net/docs/core. Dr inż. Stanisław Polak Źródła 193 I Axel Rauschmayer. Iterables and iterators in ECMAScript 6 . http://www.2ality.com/2015/02/es6-iteration.html. I Marek Stępień. marcoos.techblog. http://blog.marcoos.com/. I Basarat Ali Syed. Typescript deep dive. http://basarat.gitbooks.io/typescript/. I wikibooks.org. JavaScript. http://en.wikibooks.org/wiki/JavaScript. I Wikipedia. http://pl.wikipedia.org/. Dr inż. Stanisław Polak 194