Mini-Kurs  JavaScript  (część I)

 

MINI-KURS JAVASCRIPT - część I

 
Wstęp

Na tej stronie chciałbym przedstawić kilka informacji na temat tworzenia skryptów i sięgnąć trochę do historii. Tą stroną będą zainteresowani Ci, którzy nie mieli wcześniej styczności z apletami i to głównie ich uwadze poświęcam tę stronę.

JavaScript to język programowania, opracowany specjalnie dla potrzeb pracy w środowisku World Wide Web przez firmę Sun Microsystem i Netscape. Jest narzędziem pozwalającym na trochę bardziej interaktywne tworzenie stron WWW, niż można to osiągnąć za pomocą samego HTML-a. Daje możliwość kontrolowania zachowań internauty oglądającego stronę WWW i reagowania na nie według zadanych warunków. Poprzez tworzenie apletów można wzbogacić stronę o wiele ciekawych rozwiązań, o których jest ten kurs.

Tworzenie apletów można podzielić na kilka części. Tworzenie skryptów uruchamiających się zaraz po wczytaniu strony, niezależnie od jakichkolwiek zdarzeń. Drugi rodzaj, to funkcje wykonywane po wywołaniu ich poprzez zdarzenie (kliknięcie myszką, uzupełnienie formularza).

Teraz kilka słów o konstrukcji. Każdy aplet musi być zbudowany wg pewnego schematu:

<SCRIPT LANGUAGE="JavaScript">
<!--
Instrukcje
//-->
</SCRIPT>


Po pierwsze musimy wpisać parzysty tag, gdzie zdefiniujemy język skryptowy (bo JavaScript nie jest jedynym, chociaż bardzo znanym). Znaki komentarza pozwalają na pominięcie skryptu tym przeglądarkom, które nie radzą sobie z odczytywaniem apletów. Podobne stosuje się czasami w stylach.

Jeżeli chodzi o funkcje, to sprawa się ma podobnie. Różnica jest niewielka:


<SCRIPT LANGUAGE="JavaScript">
<!--
function Sprawdzam(zmienna)
{ Instrukcje
}
//-->
</SCRIPT>


W tym przypadku wszystkie instrukcje znajdują się między znakami { } poprzedzonymi wyrazem function i nazwą tej funkcji. Nazwa może być prawie dowolna, za wyjątkiem słów zarezerwowanych. Ponadto nazwa funkcji i zmiennych musi być niepowtarzalna, jednoznacznie identyfikująca funkcję. Co do zmiennej, to nie jest ona konieczna, jeżeli jej nie ma, to nawiasy są puste. Jeżeli już jest, to jej wartość jest równa wartości z jaką została wywołana funkcja. Jej wartość jest pomocna, gdy jedna funkcja obsługuje kilka obiektów, różniących się tylko jednym parametrem. Takich zmiennych może być więcej, wtedy należy je rozdzielić przecinkiem. Wtedy, bardzo ważna jest kolejność zmiennych, z jaką została wywołana funkcja.

Funkcja może też wywołać równie dobrze samą siebie, co nazywa się rekurencją.

Zdarzenia są wywoływane, kiedy oglądający stronę najedzie myszką na obiekt formularza, rysunek albo linkę, kliknie go, zdejmie focus itp. Są one definiowane wraz z elementem, do którego dane zdarzenie się odnosi. Omówię to na przykładzie:

<INPUT TYPE=Button VALUE=Przycisk onClick="Sprawdzam(zmienna)">

W momencie kliknięcia na taki przycisk jest wywoływane zdarzenie onClick. Wykonuje ono funkcję Sprawdzam z podanym argumentem zmienna.

<A HREF="javascript:funkcja()">Linka</A>
<A HREF="javascript:instrukcja">Linka</A>


Powyższe przykłady dają możliwość odwołania się do języka JavaScript bezpośrednio w adresie linki. W obu przypadkach konieczne jest wpisanie, że dany adres jest odwołaniem obsługiwanym przez JavaScript. W przeciwnym razie wszystko między cudzysłowem będzie traktowane jako linka. Na pasku statusu pojawi się instrukcja, a nie jak zwykle adres linki.

Podobnie jak HTML, JavaScript posiada możliwość wstawiania komentarza, niewidocznego dla przeglądarki i internauty. Pierwszy z nich dotyczy komentarzy zawartych tylko w jednej linijce:

function Sprawdzam(zmienna) //Ta funkcja sprawdzi dane
{ Instrukcje
}

W powyższym przypadku już żadna instrukcja nie może pojawić się za komentarzem. Jako jego koniec traktowany jest koniec linijki. Drugi sposób, pozwala wprowadzić dłuższe notatki:

function Sprawdzam(zmienna) /*Ta funkcja sprawdzi dane
potrzebne do formularza*/
{ Instrukcje
}


Podobnie jak w HTML-u jest otwierany i zamykany. Może być umieszczany w wielu linijkach. Daje możliwość wprowadzania bardziej rozbudowanych treści.

Na zakończenie dodam jeszcze, że bardzo ważna jest wielkość liter zmiennych, funkcji itd. Zmienna zadeklarowana jako policz, a wywołana jako Policz spowoduje błąd.

Wszystkie instrukcje muszą być rozdzielone średnikami. Nieraz przeglądarka wykona skrypt, ale dla pewności i poprawności, warto stawiać średniki na końcu każdej instrukcji.

W temacie przeglądarek można rzec, że wszystko sprowadza się do dwóch wielkich konkurentów: Microsoftu oraz Netscape'a. Powodem tego jest to, że Navigator, a teraz także Explorer to produkty freewarowe. W zasadzie same zalety, ale więcej różnic niż podobieństw między tymi produktami, co powoduje problemy. Przede wszystkim arkusze stylów są dużo lepiej obsługiwane przez IE. Daje to możliwość lepszego panowania nad położeniem, kolorem, czy wielkością elementów strony.

Co do obsługi JavaScrit przez te przeglądarki, to już jest lepiej, ale nie doskonale. Przede wszystkim język programowania skryptów proponowany przez Netscape'a JavaScript, nie jest bratem bliźniakiem JScriptu Microsoftu. Problem polega na tym, że istnieją instrukcje, które są obsługiwane tylko przez Navigatora, inne tylko przez Explorera. Jedyną tego zaletą jest to, że można, w sposób alternatywny, określić za pomocą której przeglądarki została otworzona dana strona.

Ponieważ język stale się rozwija, mamy już kolejne wersje tego języka, pomocne m.in. przy tworzeniu dynamicznych stron DHTML. Efektem tego jest zróżnicowanie w programowaniu skryptowym przeglądarek. Nie dość, że należy sprawdzić, czy dany skrypt działa w obydwu konkurencyjnych przeglądarkach, to nie wiadomo, czy starsze wersje go odczytają.

Debugger. To jest to, co pomoże poradzić sobie z problemem, jaki napotykają twórcy stron WWW. Debugger to program, który pomaga znaleźć błędy w skryptach. Pozwala śledzić kolejne wykonywane instrukcje i odszukać tę felerną linijkę, która stanowi problem.

Jest jeszcze jedna różnica pomiędzy przeglądarkami. Dość istotna dla tych, którzy często korzystają ze źródła strony. Otóż polega to na tym, że Explorer pokaże prawdziwe źródło strony, czyli identyczne, jak to, które napisał twórca strony. Navigator czasami pokaże inną treść źródła. Jeżeli zadeklarujemy formatowanie tekstu w JavaScript, to przeglądarka Netscape'a pokaże ten tekst za pomocą tylko dostępnych tagów HTML-a. Najlepiej przekonać się o tym dokładnie oglądając źródło strony formatowania tekstu.

Chciałbym tutaj przedstawić podstawowe zasady tworzenia prostych apletów. Przede wszystkich jednak tych apletów, które można szybko i samodzielnie dodać do swoich stron, niewymagających wielkiego zaangażowania i poświęcenia w sprawdzaniu poprawności. Zdecydowana większość skryptów jest wraz z przykładami. Te łatwe utworzone tylko za pomocą skryptów są pod przyciskiem Test. Jeżeli jednak tak nie jest, to zawsze można zajrzeć do źródła, gdzie dany aplet został wykorzystany. Tam, gdzie można tworzyć bardziej zaawansowane rzeczy jest linka Master w postaci rysunku diamentu do nowego okienka.

Wprowadziłem dość jednolitą strukturę, by można było się swobodnie poruszać. A więc nagłówek, poniżej metody, właściwości i parametry używane przy danym temacie. Część właściwa Kursu, gdzie znajdują się wszystkie informacje dotyczące danego tematu. Czasem rozdzielone linią, by rozdzielić ważniejsze zagadnienia. Ważniejsze informacje (jeżeli takie są) dotyczące danego tematu, znajdują się na końcu pod linią.

Oprócz samego Kursu można tu znaleźć inne ciekawe rzeczy związane z programowaniem w JavaScript. Stają się pomocne przy poszukiwaniach konkretnych instrukcji - hierarchia.

Do przeglądania stron polecam najnowszego Explorera, można go ściągnąć z bardzo wielu miejsc na friko (dodawany do CD wszystkich szanujących się pism komputerowych). Ja także używałem MSIE i obsługuje wszystkie przedstawione tu rozwiązania (chyba, że napisałem inaczej). Ale ze względu na różnorodność przeglądarek nie ręczę, że wszystko działać będzie, jak należy, pomimo tego, że dołożyłem wszelkich starań, by tak było.

Jego dodatkową zaletą jest dobra obsługa arkuszy stylów (CSS), co poprawia walory wizualne strony. A moje strony są bardzo przesycone stylami. A to wszystko po to, by łatwiej było znaleźć na nich to wszystko, co jest potrzebni. Mogłem to także uczynić zapychając kilobajtami grafiki i powodując wolniejsze ładowanie stron.
To wszystko sprawia, że moje strony są przejrzyste i lekkie.

Rodzaje zmiennych

Na początek kilka słów o definiowaniu zmiennych. Zmienna zdefiniowana w dokumencie, ale nie w funkcji to zmienna globalna. Jest ona w pamięci przez cały czas i można się do niej odwoływać we wszystkich skryptach i funkcjach. W przypadku zadeklarowania zmiennych w funkcji - zmienne lokalne - o tej samej nazwie, jak zmienna globalna, wszystkie instrukcje tej funkcji odnoszące się do tej zmiennej, będą się odnosiły do zmiennej lokalnej. Ponadto wszelkie jej modyfikacje nie spowodują zmiany wartości zmiennej globalnej. Nie można używać zmiennych bez uprzedniego ich zadeklarowania. Można to zrobić w dowolnym miejscu programu, nawet bezpośrednio przed jej użyciem:

var Zmienna

W taki sposób utworzona została dana o nazwie Zmienna. Jej wartość jest na razie nieokreślona, czyli domyślnie undefined. Jeżeli wartość nie może być określona, na przykład w przypadku dzielenia przez zero, to otrzymamy infinity. W zależności od tego, co podstawimy za wartość zmiennej, to do odpowiedniego typu będzie ona należeć.

Drugim rodzajem definiowania danej jest przypisanie jej po prostu wartości, ona zdecyduje jednoznacznie o rodzaju zmiennej. Obydwie formy są poprawne:

Zmienna=123
var Zmienna=123

Bardzo ważną rzeczą w nazewnictwie jest wielkość użytych liter. Zmienne zdefiniowane wewnątrz funkcji nie są dostępne poza nią. Są to wyżej wspomniane zmienne lokalne

W języku JavaScript można wyróżnić kilka rodzajów zmiennych. W nawiasach są podane ich nazwy oryginalne:

Łańcuch znaków. (tring) Jest to dowolny ciąg znaków umieszczany zawsze w cudzysłowu podwójnym lub w pojedynczym:

Zmienna="1 jest_MnieJszE-od+3"

Zmienna tring może być także zbudowana ze znaków i innej zmiennej. W takim przypadku trzeba rozdzielić tring od zmiennej. Służy do tego cudzysłów. O jego używaniu dalej.

Zmienna liczbowa. (number) Czyli po prostu liczba. Miejsca dziesiętne oddziela się kropką. Liczbę można zapisać w jednym z formatów:

Zmienna=25.2 - standartowo w systemie dziesiątkowym,
Zmienna=25e-2 - czyli 25/100,

Zmienne logiczne. (boolean) Przyjmują tylko dwie wartości: true (1) albo false (0):

Zmienna=true

Wartość Null. (object) Jest to bardzo specyficzna wartość zmiennej. Oznacza nic, czyli de facto jej wartość nie istnieje. Dla przykładu w okienkach dialogowych po naciśnięciu anuluj zwracana jest wartość null. Podobnie jak w przypadku liczb i wartości logicznych nie należy stosować cudzysłowu, bo wtedy otrzymamy łańcuch znaków:

Zmienna=null

Chcąc sprawdzić do jakiego typu należy dana zmienna można użyć funkcji typeof. Zwróci ona nazwę ciągu znaków. Jeżeli chodzi o zmienne, to należy je wcześniej zdefiniować, by funkcja działała:

typeof(true) - zwróci wartość boolean.

Kolejną, dość wygodną rzeczą jaką daje JavaScript, jest możliwość skracania kodu. Załóżmy, że polecenie odwołania się do konkretnego elementu formularza jest powtarzane dosyć sporą ilość razy, wtedy takie skrócenie staje się wygodniejsze:

document.Form.Test.value;

Można rozwiązać ten problem poprzez zastosowanie dowolnej zmiennej, której należy przypisać dany obiekt:

F=document.Form.Test;

Zmiennej F przypisałem tylko obiekt, bez właściwości value. Podobnie jak metody, właściwości nie można przypisać nowej zmiennej. Należy ją przywołać przy każdorazowym uzyciu nowego obiektu. Po takiej modyfikacji można przypisać wartości F dowolną właściwość, a tej znowu nową wartość, powodując w ten sposób modyfikację w formularzu:

F.value="Cześć!"

Dzieje się tak dlatego, że zmienna F jest obiektem, któremu można przypisywać własności i metody. Jednak tylko te, jaki dany obiekt obsługuje. W tym przypadku wartość VALUE elementu formularza będzie wynosiła Cześć!.

W temacie operacji na liczbach wygląda to tak, że wszystko zależy od rodzajów zmiennych - argumentów. Suma łańcuchów zmiennych tring jest zmienną łańcuchową wg podanej zasady:

Zmienna1="Damian"
Zmienna2="Szczepanik"
Zmienna1+Zmienna2="DamianSzczepanik";

Przede wszystkim nie sprawdza się przemienność dodawania. Żadna ze zmiennych nie posiadała spacji, suma też jej nie posiada. Podobny efekt będzie, gdy dodamy liczbę i zmienną łańcuchową. Można także dodawać bezpośrednio tring do zmiennej:

Zmienna="Tekst"+Imie;

W tym przypadku Tekst jest tringiem, Imie wcześniej zdefiniowaną zmienną - jej rodzaj nie jest ważny. Problem może się pojawić, gdy tring zawiera już jakieś cudzysłowy. Wtedy, ten, który znajduje się pierwszy rozpoczyna tring, drugi jest jego częścią:

Zmienna="Tekst 'Tutul' "+Imie;

Efektem operacji na zmiennych liczbowych jest liczba wynikła z działania. Jeżeli chcemy, by liczby były traktowane jako zmienne łańcuchowe, to należy dodać np. między nimi pusty element tring:

Zmienna=125+""+521
Zmienna=125521

W przypadku innych operacji na zmiennych łańcuchowych otrzymamy najprawdopodobniej wartość NaN (Not a Number). Taka wartość zostanie zwrócona, bo JavaScript nie mogła zakwalifikować danego wyniku jako liczby.

Co się tyczy operacji na zmiennych logicznych i wartości null, to wiadomo, że true jako prawda jest traktowane jako 1. Dwie pozostałe wartości to 0. Powinny być traktowane przez przeglądarki, jako te właśnie liczby, ale może wystąpić wartość infinity lub NaN.

Teraz kilka użytecznych funkcji do konwersacji zmiennych z jednego typu do innego. Wspomniana wyżej wartość NaN po zmodyfikowaniu pozwala określić, czy dana zmienna nie jest liczbą. Oznacza to, że zwraca wartość false jeżeli dana zmienna jest liczbą. Na przykład:

isNaN(25) - zwróci wartość false,
isNaN(a1) - zwróci wartość true.

Jeżeli już stwierdzimy, że dana zmienna jest liczbą, możemy ją konwertować do liczby całkowitej przez funkcję pareInt lub zmiennoprzecinkowej - wymiernej przez parseFloat Teraz kilka przykładów dla lepszego rozeznania się w tych funkcjach:

parseInt(5e1) - zwróci wartość 5.
parseInt(-21a) - zwróci wartość -21.
parseFloat(-2.3) - zwróci wartość -2.3.
parseFloat(-12.1+5) - zwróci wartość -12.

W drugim przykładzie zwrócona wartość wynosi -21, chociaż argument nie jest liczbą, ale jego pierwsze 3 znaki są i te zostały zamienione. W czwartym przypadku można by się spodziewać liczby -7.1, ale przypominam, że to jest traktowane jako ciąg znaków, plus nie jest żadną liczbą.

Jeszcze jedna bardzo przydatna instrukcja. Konwertuje ona działanie na argumencie przedstawione jako tring. Jest to pomocna, gdy wywołujemy funkcję z wartością jako tring, a należy wykonać na niej działanie Oto zastosowanie:

Zmienna1="10+2*4"
Zmienna2=eval(Zmienna1) - zmienna będzie wynosiła 18, będzie zmienną typu number.
 

C.D. w drugiej części kursu JavaScript


D.F.



Copyright © by MiniMax 1997/2007. All rights reserverd!