SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Downloaden Sie, um offline zu lesen
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TREœCI
                                         Ajax. Æwiczenia
                                         Autor: Marcin Lis
           KATALOG KSI¥¯EK               ISBN: 83-246-0686-6
                                         Format: A5, stron: 168
                      KATALOG ONLINE     Przyk³ady na ftp: 32 kB


       ZAMÓW DRUKOWANY KATALOG


              TWÓJ KOSZYK
                    DODAJ DO KOSZYKA     Ajax to nowe podejœcie do tworzenia witryn internetowych bazuj¹ce na ró¿norodnych
                                         technologiach, takich jak HTML i JavaScript, obiekty XMLHttpRequest, style CSS,
                                         model DOM czy XML. Charakterystyczne dla stron budowanych zgodnie z tym
         CENNIK I INFORMACJE             podejœciem jest to, ¿e nie wymagaj¹ one prze³adowywania. Dziêki temu, ¿e przesy³ane
                                         s¹ tylko niezbêdne dane, takie witryny internetowe dzia³aj¹ w sposób zbli¿ony do
                   ZAMÓW INFORMACJE      standardowych aplikacji. Daje to wiele nowych mo¿liwoœci, dlatego Ajax zas³u¿enie
                     O NOWOœCIACH        szybko zyska³ du¿¹ popularnoœæ.
                                         „Ajax. Æwiczenia” to zbiór praktycznych æwiczeñ pokazuj¹cych, jak za pomoc¹
                       ZAMÓW CENNIK      technologii zwi¹zanych z Ajaksem oraz jêzyka PHP wykonywaæ operacje pozwalaj¹ce
                                         tworzyæ bardziej reaktywne witryny. Wykonuj¹c kolejne æwiczenia, nauczysz siê miêdzy
                                         innymi wysy³aæ i pobieraæ dane za pomoc¹ obiektów XMLHttpRequest oraz dynamicznie
                 CZYTELNIA               aktualizowaæ strony. Dowiesz siê, w jaki sposób Ajax wspó³pracuje ze skryptami PHP
                                         oraz jak obs³ugiwaæ dane XML. Poznasz tak¿e wiele ró¿nych technik pozwalaj¹cych
          FRAGMENTY KSI¥¯EK ONLINE       na efektywne przesy³anie informacji miêdzy serwerem a przegl¹dark¹ w synchroniczny
                                         i asynchroniczny sposób. Dziêki lekturze tej ksi¹¿ki nauczysz siê tworzyæ bogatsze
                                         i bardziej reaktywne witryny internetowe.
                                         • Przesy³anie danych za pomoc¹ obiektów XMLHttpRequest
                                         • Wspó³praca Ajaksa z PHP
                                         • Obs³uga danych XML
                                         • Przesy³anie danych w ró¿nych formatach
                                         • Generowanie kodu po stronie serwera
                                         • Obiekty JSON
                                                             Tchnij wiêcej ¿ycia w swoje witryny internetowe

Wydawnictwo Helion
ul. Koœciuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Spis treści
            Wstęp                                               5
Rozdział 1. Podstawy                                             9
            Pierwsze kroki z AJAX-em                             9
            Obiekt XMLHttpRequest                               12
            Właściwości i metody obiektu XMLHttpRequest         17
            Wysyłanie żądania do serwera                        21
            Przesyłanie danych między przeglądarką a serwerem   23
            Transmisja synchroniczna                            31
            Inne sposoby tworzenia obiektu XMLHttpRequest       33

Rozdział 2. Kolejne kroki z AJAX-em                             39
            Pobieranie danych z różnych plików                  39
            Co nieco o obrazach                                 45
            Dynamiczne zmiany na stronie                        53

Rozdział 3. AJAX i skrypty serwera (PHP)                        59
            AJAX i PHP                                          59
            Wysyłanie danych do serwera metodą GET              67
            Wysyłanie danych do serwera metodą POST             79
            AJAX i PHP w praktyce                               87
4                          Ajax • Ćwiczenia

Rozdział 4. AJAX i XML                             105
            Krótko o XML                           105
            Reprezentacja dokumentów XML           107
            Odbieranie danych XML                  110
            Dynamiczne listy wyboru                120
            AJAX, XML i PHP                        126

Rozdział 5. Równoległa obsługa wielu żądań         133
            Problemy z równoległą obsługą żądań    133
            Użycie kilku obiektów XMLHttpRequest   140
            Wykorzystanie funkcji wewnętrznych     143

Rozdział 6. Kiedy serwer odpowiada kodem           147
            Serwer wysyła kod                      147
            Obiekty w standardzie JSON             157
4
                                         AJAX i XML

Krótko o XML
Skrót AJAX oznacza Asynchronous Javascript and XML — z samej nazwy
wynika więc, że technika ta jest związana z językiem XML. Co prawda,
jak pokazały poprzednie rozdziały, stosowanie XML-a wcale nie jest
konieczne do tworzenia aplikacji AJAX-a, warto jednak wiedzieć, jak
wygląda współpraca między XML-em i AJAX-em oraz jak się tworzy,
pobiera i przetwarza tego typu dane. Takim właśnie zagadnieniom po-
święcony jest czwarty rozdział.
XML to EXtensible Markup Language, czyli rozszerzalny język znacz-
ników. Jest to rozwijany przez organizację W3C (http://www.w3.org)
niezależny od platformy systemowej język opisu danych. Faktycznie
XML służy do wyprowadzania innych języków, tzw. aplikacji XML.
Pozwala na definiowanie struktury danych, struktury dokumentów,
zupełnie niezależnej od sposobu ich prezentacji, jak jest np. w HTML.
Nie ma w nim też narzuconego z góry zestawu znaczników. I to jest
jego największa siła. Dzięki tym cechom umożliwia łatwą wymianę
danych oraz bezproblemowe ich przetwarzanie.
Dokument XML składa się z nagłówka oraz zbioru znaczników defi-
niujących elementy dokumentu. Każdy element musi mieć znacznik
otwierający i zamykający, np.:
106                            Ajax • Ćwiczenia

      <element1>
      dane
      </element1>

chyba że jest elementem pustym (czyli niezawierającym danych). W tym
ostatnim przypadku znacznik będzie miał postać:
      <znacznik />

W nagłówku należy natomiast określić wersję języka. W dalszych ćwi-
czeniach będziemy stosować nagłówek w postaci:
      <?xml version="1.0" ?>

Elementy dokumentu XML mogą być zagnieżdżane (podobnie jak znacz-
niki HTML), np.:
      <element1>
        <element2>
        dane
        </element2>
      </element1>

Mogą także posiadać atrybuty, choć w niniejszej publikacji nie bę-
dziemy ich stosować. Jak może wyglądać prosty dokument XML? Na
przykład następująco:
      <?xml version="1.0" ?>
      <dokument>
      To jest pierwszy dokument!
      </dokument>

Mamy tu znacznik otwierający <dokument> i zamykający </dokument>. Te
znaczniki definiują element XML o nazwie dokument, natomiast tekst
znajdujący się między nimi to zawartość tego elementu. Przy czym
<dokument> bynajmniej nie jest predefiniowanym elementem języka
— jest to nasz własny znacznik, który sobie wymyśliliśmy. Równie
dobrze można go nazwać np. napis:
      <?xml version="1.0" ?>
      <napis>
      To jest pierwszy dokument!
      </napis>

Te wiadomości wystarczą już do wykonania ćwiczeń znajdujących się
na kolejnych stronach.
Rozdział 4. • AJAX i XML                     107


Reprezentacja dokumentów XML
W poprzednich rozdziałach zaprezentowano wiele ćwiczeń pokazują-
cych, w jaki sposób odbierać dane tekstowe za pomocą obiektu XMLHttp-
Request. Dane te były zarówno statyczne, jak i generowane dynamicz-
nie, jednak dostęp do nich zawsze był uzyskiwany przez odwołanie
się do właściwości responseText. Jeśli zajrzymy teraz do tabeli 1.1 z roz-
działu 1., znajdziemy w niej również właściwość responseXML. Właśnie
ona zawiera dane w formacie XML, o ile oczywiście w takiej formie
zostały przesłane z serwera. W rzeczywistości właściwość ta zawiera
obiekt posiadający właściwości pozwalające na dostęp do danych za-
wartych w pobranym dokumencie XML. Typowe właściwości zostały
przedstawione w tabeli 4.1.

 Tabela 4.1. Właściwości pozwalające na dostęp do struktury dokumentu XML

   Nazwa                 Opis
   attributes            Atrybuty węzła
   childNodes            Tablica węzłów potomnych
   documentElement       Główny element dokumentu
   firstChild            Pierwszy węzeł potomny
   lastChild             Ostatni węzeł potomny
   localName             Lokalna nazwa węzła
   name                  Nazwa węzła
   nextSibling           Kolejny węzeł sąsiadujący
   nodeName              Nazwa węzła
   nodeType              Typ węzła
   nodeValue             Wartość węzła
   previousSibling       Poprzedni węzeł sąsiadujący

Aby zrozumieć znacznie tych właściwości, trzeba wiedzieć, że doku-
ment XML w obiekcie wskazanym przez właściwość responseXML jest
traktowany jako struktura drzewiasta, w której poszczególne elementy
dokumentu są węzłami. Załóżmy, że mamy do dyspozycji dokument
XML w postaci:
108                            Ajax • Ćwiczenia

      <?xml version="1.0" ?>
      <osoba>
        <imie>
          Jan
        </imie>
        <nazwisko>
          Kowalski
        </nazwisko>
      </osoba>

Będzie on reprezentowany jako struktura widoczna na rysunku 4.1.

 Rysunek 4.1.
 Drzewiasta
 struktura
 dokumentu XML



Jak widać, taki dokument posiada węzeł (ang. node) odpowiadający
elementowi <osoba>, zaś węzeł ten posiada dwa podwęzły (ang. sub-
nodes), czyli węzły potomne (ang. child nodes): <imie> i <nazwisko>.
Każdy z węzłów potomnych posiada dodatkowo podwęzeł przecho-
wujący tekstowe dane zdefiniowane w elementach <imie> i <nazwisko>.
Wynika z tego, że:
    węzeł <osoba> jest węzłem głównym,
    właściwość firstChild węzła <osoba> to węzeł <imie>,
    właściwość lastChild węzła <osoba> to węzeł <nazwisko>,
    właściwość firstChild węzła <imie> to węzeł tekstowy
    zawierający ciąg znaków Jan,
    właściwość firstChild węzła <nazwisko> to węzeł tekstowy
    zawierający ciąg znaków Kowalski,
    właściwość nextSibling węzła <imie> to węzeł <nazwisko>,
    właściwość previousSibling węzła <nazwisko> to węzeł <imie>
    itd.
Tak więc, jeśli odbierzemy dane i dokonamy przypisania:
      var xml = XMLHttpRequestObject.responseXML;

to aby dostać się do węzła <osoba>, napiszemy:
      xml.documentElement
Rozdział 4. • AJAX i XML                    109

Aby dostać się do węzła <imie>, wpiszemy:
    xml.documentElement.firstChild

bowiem węzeł <imie> jest pierwszym węzłem potomnym (firstChild)
węzła <osoba>.
Aby dostać się do węzła <nazwisko>, napiszemy:
    xml.documentElement.lastChild

bowiem węzeł <nazwisko> jest ostatnim węzłem potomnym (lastChild)
węzła <osoba>.
Aby dostać się do węzła tekstowego zawierającego imię, napiszemy:
    xml.documentElement.firstChild.firstChild

bowiem węzeł ten jest pierwszym (i zarazem jedynym) węzłem po-
tomnym węzła <imie>.
Można by przytoczyć jeszcze kilka innych konstrukcji (np. wykorzy-
stujących węzły sąsiadujące), nie ma chyba jednak takiej potrzeby —
zasady dostępu z pewnością są już jasne.
Niestety powyższy opis sprawdzi się w pełni tylko w przypadku prze-
glądarki Internet Explorer. Przeglądarki oparte na module Gecko (np.
Firefox), ale również np. Opera nieco inaczej interpretują dane XML.
Otóż białe znaki (a więc znaki końca linii, tabulacji, spacje itp.) znaj-
dujące się w treści dokumentu pomiędzy znacznikami są traktowane
jako węzły tekstowe. Stąd przedstawiony wyżej dokument — jako
obiekt XML w przeglądarce — będzie miał postać przedstawioną na
rysunku 4.2.

 Rysunek 4.2.
 Struktura
 dokumentu XML
 w przeglądarkach
 Firefox, Opera itp.



Tak więc w tym przypadku węzeł <osoba> również jest węzłem głów-
nym, ale pierwszym węzłem potomnym jest węzeł tekstowy zawiera-
jący znak końca linii i spacje. Dopiero pierwszym sąsiadem tego węzła
jest węzeł <imie>. Jeśli zatem odbierzemy dane i dokonamy przypisania:
    var xml = XMLHttpRequestObject.responseXML;
110                            Ajax • Ćwiczenia

to aby dostać się do węzła <osoba>, napiszemy:
      xml.documentElement

Aby dostać się do węzła <imie>, wpiszemy:
      xml.documentElement.firstChild.nextSibling

bowiem węzeł <imie> jest kolejnym węzłem sąsiadującym (nextSibling)
z pierwszym węzłem potomnym (firstChild) węzła <osoba>.
Aby dostać się do węzła <nazwisko>, napiszemy:
      xml.documentElement.lastChild.previousSibling

bowiem węzeł <nazwisko> jest przedostatnim węzłem potomnym (czyli
wcześniejszym węzłem sąsiadującym ostatniego węzła potomnego)
węzła <osoba>.
Aby dostać się do węzła tekstowego zawierającego imię, napiszemy:
      xml.documentElement.firstChild.nextSibling.firstChild

bowiem węzeł ten jest pierwszym (i zarazem jedynym) węzłem po-
tomnym węzła <imie>.
Jak widać, czasami niezbędne może okazać się pisanie dwóch wersji
kodu, obsługujących dwa przedstawione sposoby reprezentacji danych.
Jednak w wielu przypadkach uda nam się obejść te ograniczenia i utwo-
rzyć kod działający poprawnie w obu rodzajach przeglądarek. Pomoc-
na może być w tym właściwość nodeType każdego węzła, pozwalająca
określić jego typ. Typy węzłów i odpowiadające im wartości zostały
przedstawione w tabeli 4.2. Ich znajomość przyda się przy wykonywa-
niu jednego z ćwiczeń przedstawionych w kolejnym podrozdziale.




Odbieranie danych XML
Dwa poprzednie podrozdziały zawierały wiele informacji na temat XML-a
i sposobu reprezentacji dokumentów tego typu w przeglądarkach. Czas
wykorzystać tę wiedzę i wykonać pierwszy przykład, który pokaże,
jak za pomocą AJAX-a pobrać dane znajdujące się w pliku tekstowym
zawierającym dokument XML oraz wyświetlić je na ekranie przeglądarki.
Rozdział 4. • AJAX i XML         111

       Tabela 4.2. Typy węzłów dokumentu XML

          Wartość       Typ węzła
          1             Element
          2             Atrybut
          3             Węzeł tekstowy
          4             Sekcja CDATA
          5             Referencja do encji
          6             Węzeł encji
          7             Instrukcje przetwarzania XML
          8             Komentarz XML
          9             Węzeł dokumentu XML
          10            Definicja typu dokumentu
          11            Część dokumentu XML
          12            Notacja XML

Ć W I C Z E N I E

     4.1            Pobieranie danych XML

    Napisz skrypt pobierający z serwera dane w formacie XML i wyświe-
    tlający je na ekranie.
    Najpierw należy przygotować plik w formacie XML. Będzie on miał
    bardzo prostą postać:
              <?xml version="1.0" ?>
              <imie>
                Anna
              </imie>

    Cała zawartość takiego dokumentu to jeden element (określony przez
    znacznik <imie>) zawierający dane o imieniu Anna. Przedstawioną treść
    należy zapisać w pliku index.xml.
    Jak pobrać w tle i przetworzyć takie dane, pokazuje skrypt widoczny
    na poniższym listingu:
112                            Ajax • Ćwiczenia

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
      <title>Ajax</title>
      <script type="text/javascript">
      var XMLHttpRequestObject = false;

      if(window.XMLHttpRequest){
        XMLHttpRequestObject = new XMLHttpRequest();
      }
      else if(window.ActiveXObject){
        XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
      }

      function pobierzDane(dest)
      {
        if(XMLHttpRequestObject){
          var div = document.getElementById(dest);

          var url = "http://localhost/index.xml";
          XMLHttpRequestObject.open("GET", url);

          XMLHttpRequestObject.onreadystatechange = function()
          {
            if (XMLHttpRequestObject.readyState == 4 &&
                XMLHttpRequestObject.status == 200){
              var xml = XMLHttpRequestObject.responseXML;
              var imie = xml.documentElement.firstChild.nodeValue;
              var str = "Imię odczytane z dokumentu XML to: " + imie;
              div.innerHTML = str;
            }
          }
          XMLHttpRequestObject.send(null);
        }
      }
      </script>
      </head>
      <body>
      <input type="button" value="Kliknij tu"
              onclick="pobierzDane('dataDiv');" />
      <hr>
      </div>
      <div id="dataDiv">
      Ten tekst zostanie zmieniony.
      </div>
      </body>
      </html>
Rozdział 4. • AJAX i XML                113

Na stronie znajduje się przycisk, któremu została przypisana procedura
obsługi zdarzenia onclick w postaci funkcji pobierzDane oraz warstwa
o identyfikatorze dataDiv służąca do wyświetlania danych. Funkcja
pobierzDane przyjmuje jeden argument określający identyfikator war-
stwy, na której mają pojawić się wyniki jej działania. W jej wnętrzu na
początku wykonywane są typowe operacje niezbędne do transmisji
i przetwarzania danych, czyli pobranie obiektu warstwy wskazywanej
przez argument dest:
        var div = document.getElementById(dest);

podanie adresu wskazującego plik XML, który ma zostać pobrany:
        var url = "http://localhost/index.xml";

oraz zainicjowanie żądania za pomocą metody open:
        XMLHttpRequestObject.open("GET", url);

Dane tradycyjnie odczytywane są za pomocą funkcji anonimowej przy-
pisanej właściwości onreadystatechange obiektu XMLHttpRequestObject.
W przeciwieństwie jednak do przykładów prezentowanych we wcze-
śniejszych rozdziałach, odczyt następuje przez odwołanie się do wła-
ściwości responseXML:
    var xml = XMLHttpRequestObject.responseXML;

Po wykonaniu takiej instrukcji zmienna xml będzie zawierała obiekt
odzwierciedlający strukturę dokumentu XML. Ponieważ nasz dokument
ma bardzo prostą strukturę, gdzie elementem głównym jest znacznik
<imie>, to dostęp do tego znacznika osiągamy przez odwołanie się do
właściwości documentElement, natomiast dostęp do węzła tekstowego
zawierającego imię — przez odwołanie się do właściwości firstChild.
nodeValue. Jest to realizowanie przez instrukcję:
    var imie = xml.documentElement.firstChild.nodeValue;

Odczytana wartość węzła tekstowego jest następnie wykorzystywana
do skonstruowania napisu, który pojawi się na stronie. Jest on zapi-
sywany w zmiennej str:
    var str = "Imię odczytane z dokumentu XML to: " + imie;

Z kolei wartość zmiennej str jest przypisywana właściwości in-
nerHTML warstwy wskazywanej przez obiekt div:
    div.innerHTML = str;

Ostatecznie po kliknięciu przycisku zobaczmy widok przedstawiony
na rysunku 4.3.
114                              Ajax • Ćwiczenia

       Rysunek 4.3.
       Dane pobrane
       z dokumentu
       XML zostały
       wyświetlone
       na stronie




    Ćwiczenie 4.1 pokazało, w jaki sposób odebrać dane w formacie XML
    i wyświetlić je na witrynie. Struktura dokumentu była jednak bardzo
    prosta, nie występowały więc żadne problemy związane z różnymi spo-
    sobami reprezentacji danych stosowanych w przeglądarkach, a opisa-
    nych w poprzednim podrozdziale. Spróbujmy zatem poprawnie prze-
    tworzyć nieco bardziej złożony dokument zawierający zagnieżdżone
    znaczniki.

Ć W I C Z E N I E

     4.2            Przetwarzanie dokumentu XML

    Napisz skrypt przetwarzający dane z dokumentu XML zawierającego
    kilka zagnieżdżonych znaczników.
    Dokument XML, który wykorzystamy w tym ćwiczeniu (należy go za-
    pisać w pliku index.xml), będzie miał postać:
            <?xml version="1.0" ?>
            <imiona>
              <imie>
                Anna
              </imie>
              <imie>
                Magdalena
              </imie>
              <imie>
                Jolanta
              </imie>
            </imiona>

    Nie jest on bardzo skomplikowany, jest to jednak struktura drzewiasta,
    bardziej złożona niż w poprzednim ćwiczeniu. Widzimy, że elementem
    głównym jest znacznik <imiona>. Wewnątrz niego za pomocą znaczni-
    ków <imie> zostały zdefiniowane trzy kolejne elementy, a każdy z tych
    elementów zawiera dane tekstowe. Możemy być zatem pewni, że Inter-
Rozdział 4. • AJAX i XML                       115

net Explorer zinterpretuje te dane inaczej niż Firefox czy Opera. Pierw-
szym pomysłem, który się nasuwa, jest rozpoznanie typu przeglądarki
(co i tak wykonujemy podczas tworzenia obiektu XMLHttpRequest) oraz
napisanie dwóch różnych wersji kodu. W tym przypadku nie musimy
jednak tak postępować. Zamiast tego wystarczy bowiem odpowiednio
wykorzystać właściwości childNodes i nodeType, tak jak zostało to wyko-
nane w poniższym skrypcie:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
    <title>Ajax</title>
    <script type="text/javascript">
    var XMLHttpRequestObject = false;

    if(window.XMLHttpRequest){
      XMLHttpRequestObject = new XMLHttpRequest();
    }
    else if(window.ActiveXObject){
      XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
    }

    function przetwarzajXML(xml, dest)
    {
      var div = document.getElementById(dest);
      var imiona = xml.documentElement.childNodes;
      var str = "Imiona odczytane z danych XML: <br />";
      for(var i = 0; i < imiona.length; i++){
        if(imiona[i].nodeType == 1){
          str += imiona[i].firstChild.nodeValue + "<br />";
        }
      }
      div.innerHTML = str;
    }

    function pobierzDane(dest)
    {
      if(XMLHttpRequestObject){
        var url = "http://localhost/index.xml";
        XMLHttpRequestObject.open("GET", url);

        XMLHttpRequestObject.onreadystatechange = function()
        {
          if (XMLHttpRequestObject.readyState == 4 &&
              XMLHttpRequestObject.status == 200){
            var xml = XMLHttpRequestObject.responseXML;
116                              Ajax • Ćwiczenia

                przetwarzajXML(xml, dest);
            }
          }
          XMLHttpRequestObject.send(null);
        }
      }
      </script>
      </head>
      <body>
      <input type="button" value="Kliknij tu"
              onclick="pobierzDane('dataDiv');" />
      <hr>
      </div>
      <div id="dataDiv">
      Ten tekst zostanie zmieniony.
      </div>
      </body>
      </html>

Przycisk oraz warstwa z danymi zostały zdefiniowane w taki sam spo-
sób jak w poprzednim ćwiczeniu. Funkcja pobierzDane ma również po-
dobną strukturę. Pewnym zmianom uległa natomiast funkcja ano-
nimowa przypisana właściwości onreadystatechange obiektu XMLHttp-
RequestObject. Najpierw pobiera ona obiekt XML będący reprezentacją
danych przesłanych z serwera:
      var xml = XMLHttpRequestObject.responseXML;

a następnie przekazuje go w postaci argumentu funkcji przetwarzajXML
zajmującej się przetwarzaniem i interpretacją danych:
      przetwarzajXML(xml, dest);

Drugim argumentem jest identyfikator warstwy, na której ma się po-
jawić tekst wynikowy.
Funkcja przetwarzajXML najpierw pobiera obiekt warstwy (i przypisuje go
zmiennej div):
      var div = document.getElementById(dest);

a następnie tablicę zawierającą węzły potomne węzła głównego (jest
ona zapisana we właściwości childNodes):
      var imiona = xml.documentElement.childNodes;

Ponieważ węzłem głównym jest w tym przypadku <imiona>, tablica ta
będzie zawierała elementy zdefiniowane za pomocą znaczników
<imie> oraz — w przypadku przeglądarek innych niż Internet Explorer
— węzły tekstowe. Pozostaje więc znaleźć sposób na odróżnienie ich
Rozdział 4. • AJAX i XML               117

od siebie i pobranie danych tylko węzłów typu <imie>. Ta czynność
wykonywana jest w pętli for:
      for(var i = 0; i < imiona.length; i++){

Przechodzi ona wszystkie elementy tablicy imiona, począwszy od ele-
mentu pierwszego, o indeksie 0, aż do ostatniego, o indeksie imiona.
length – 1 (o jeden mniejszym niż całkowity rozmiar tablicy zapisany
we właściwości lenght).
We wnętrzu pętli za pomocą instrukcji warunkowej if sprawdzany jest
typ węzła zapisany we właściwości nodeType każdego z nich. W przy-
padku naszego dokumentu będziemy mieli do czynienia z dwoma
typami węzłów:
    typem 1 — definiującym element XML (czyli określonym za
    pomocą znaczników <imie>),
    typem 3 — tekstowym.
Tak więc odwołanie do imion ma sens tylko wtedy, kiedy aktualnie
przetwarzany węzeł ma typ równy 1:
    if(imiona[i].nodeType == 1){

W takim przypadku, ponieważ mamy wtedy do czynienia z elementem
<imie>, trzeba się odwołać do pierwszego (i jedynego) węzła potom-
nego zawierającego dane konkretnego imienia. Dane te są dopisywane
do zmiennej str:
    str += imiona[i].firstChild.nodeValue + "<br />";

Dzięki temu po zakończeniu pętli mogą być one wyświetlone na dol-
nej warstwie, tak jak jest to widoczne na rysunku 4.4.

 Rysunek 4.4.
 Imiona odczytane
 z dokumentu XML
118                              Ajax • Ćwiczenia

    Oprócz przedstawionego wyżej sposobu pobierania danych, niezależ-
    nego do przeglądarki, jaka jest do tego wykorzystywana, istnieje także
    inny. Otóż zamiast przeglądać „ręcznie” strukturę dokumentu, moż-
    na wykorzystać metodę getElementsByTagName, która pobierze wszyst-
    kie węzły o zadanej nazwie i zwróci je w postaci tablicy. Wystarczy
    więc wywołać ją na rzecz obiektu odzwierciedlającego strukturę do-
    kumentu (zapisanego we właściwości responseXML), aby otrzymać dane
    poszukiwanych węzłów bez konieczności sprawdzania ich typów.
    Jak to zrobić, pokaże kolejne ćwiczenie.

Ć W I C Z E N I E

     4.3.           Użycie metody getElementsByTagName

    Zmodyfikuj kod ćwiczenia 4.2, tak aby do przetwarzania danych zo-
    stała użyta metoda getElementsByTagName.
    Treść dokumentu XML pozostanie taka sama jak w poprzednim ćwi-
    czeniu, natomiast kod skryptu będzie miał następującą postać:
            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
            <html>
            <head>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
            <title>Ajax</title>
            <script type="text/javascript">
            var XMLHttpRequestObject = false;

            if(window.XMLHttpRequest){
              XMLHttpRequestObject = new XMLHttpRequest();
            }
            else if(window.ActiveXObject){
              XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
            }

            function przetwarzajXML(xml, dest)
            {
              var div = document.getElementById(dest);
              var imiona = xml.getElementsByTagName('imie');
              var str = "Imiona odczytane z danych XML: <br />";
              for(var i = 0; i < imiona.length; i++){
                var imie = imiona[i].firstChild.nodeValue;
                str += imie + "<br />";
              }
              div.innerHTML = str;
            }
Rozdział 4. • AJAX i XML                  119

    function pobierzDane(dest)
    {
      if(XMLHttpRequestObject){
        var url = "http://localhost/index.xml";
        XMLHttpRequestObject.open("GET", url);

        XMLHttpRequestObject.onreadystatechange = function()
        {
          if (XMLHttpRequestObject.readyState == 4 &&
              XMLHttpRequestObject.status == 200){
            var xml = XMLHttpRequestObject.responseXML;
            przetwarzajXML(xml, dest);
          }
        }
        XMLHttpRequestObject.send(null);
      }
    }
    </script>
    </head>
    <body>
    <input type="button" value="Kliknij tu"
            onclick="pobierzDane('dataDiv');" />
    <hr>
    </div>
    <div id="dataDiv">
    Ten tekst zostanie zmieniony.
    </div>
    </body>
    </html>

Ogólna struktura skryptu jest taka sama jak w ćwiczeniu 4.2, zmianie
uległa jednak treść funkcji przetwarzajXML. Po pobraniu obiektu warstwy
docelowej o identyfikatorze wskazywanym przez argument dest:
      var div = document.getElementById(dest);

następuje wywołanie metody getElementsByTagName operującej na obiekcie
dokumentu XML:
      var imiona = xml.getElementsByTagName('imie');

Argumentem wywołania tej metody jest ciąg znaków określający, jakie
elementy (węzły) dokumentu chcemy pobrać (w tym przypadku są to
elementy zdefiniowane przez znaczniki <imie>), natomiast wynikiem
działania jest tablica węzłów. Ta tablica przypisywana jest zmiennej
imiona. Odczytanie imion odbywa się w pętli for, która przebiega
wszystkie elementy tablicy:
      for(var i = 0; i < imiona.length; i++){
120                               Ajax • Ćwiczenia

Ponieważ w każdej komórce znajduje się jeden węzeł zdefiniowany
za pomocą znacznika <imie>, to dane dotyczące imienia odnajdziemy
w pierwszym węźle potomnym, czyli we właściwości firstChild.node-
Value:
          var imie = imiona[i].firstChild.nodeValue;

Każde odczytane imię jest zapisywane w zmiennej pomocniczej imie,
która następnie wykorzystywana jest przy tworzeniu ciągu zapisywa-
nego w zmiennej str:
          str += imie + "<br />";

który po zakończeniu pętli zostanie wyświetlony na warstwie do-
celowej:
      div.innerHTML = str;




Dynamiczne listy wyboru
Skoro wiemy już, w jaki sposób pobierać i przetwarzać dane XML, mo-
żemy wykonać ćwiczenie wykorzystujące tę technikę do budowania
dynamicznych list wyboru. Listy takie są standardowo tworzone za
pomocą znacznika <select>, a wszystkie zawarte w nich opcje umiesz-
czane są w pliku HTML za pomocą serii znaczników <option>. Nic nie
stoi jednak na przeszkodzie, aby opcje zostały zapisane w pliku XML
i były pobierane w tle dopiero na żądanie użytkownika. Taki efekt reali-
zowany jest w ćwiczeniu 4.4. Do wykonania tego ćwiczenia niezbędna
jest znajomość dynamicznego tworzenia opcji w listach rozwijalnych.
Na szczęście nie jest to skomplikowane.
Każda lista ma właściwość options zawierającą dostępne na niej opcje.
Zakładając więc, że obiekt listy jest zawarty w zmiennej lista, do
pierwszej (o indeksie 0) pozycji listy odwołamy się, pisząc: lista.
options[0], do drugiej — lista.options[1] itd. Tablica options posiada
z kolei właściwość length, która zawiera całkowitą liczbę opcji. Co waż-
ne, przypisanie tej właściwości wartości 0:
      lista.options.length = 0;

spowoduje usunięcie wszystkich pozycji z listy. Jeśli chcemy dodać
nową pozycję do listy, należy utworzyć obiekt typu Option i przypisać
go tej pozycji. Schematyczne wywołanie konstruktora ma postać:

Weitere ähnliche Inhalte

Ähnlich wie Ajax. Ćwiczenia

AJAX i PHP. Tworzenie interaktywnych aplikacji internetowych
AJAX i PHP. Tworzenie interaktywnych aplikacji internetowychAJAX i PHP. Tworzenie interaktywnych aplikacji internetowych
AJAX i PHP. Tworzenie interaktywnych aplikacji internetowychWydawnictwo Helion
 
Tworzenie stron WWW z wykorzystaniem Ajaksa. Projekty
Tworzenie stron WWW z wykorzystaniem Ajaksa. ProjektyTworzenie stron WWW z wykorzystaniem Ajaksa. Projekty
Tworzenie stron WWW z wykorzystaniem Ajaksa. ProjektyWydawnictwo Helion
 
Nowe Trendy W Projektowaniu Aplikacji Webowych
Nowe Trendy W Projektowaniu Aplikacji WebowychNowe Trendy W Projektowaniu Aplikacji Webowych
Nowe Trendy W Projektowaniu Aplikacji WebowychMarcin Daczkowski
 
Paleta możliwości web developera
Paleta możliwości web developeraPaleta możliwości web developera
Paleta możliwości web developeraTomasz Borowski
 
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?PHPCon Poland
 
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...PROIDEA
 
Delphi. Techniki bazodanowe i internetowe
Delphi. Techniki bazodanowe i internetoweDelphi. Techniki bazodanowe i internetowe
Delphi. Techniki bazodanowe i internetoweWydawnictwo Helion
 
JavaScript. Ćwiczenia praktyczne. Wydanie II
JavaScript. Ćwiczenia praktyczne. Wydanie IIJavaScript. Ćwiczenia praktyczne. Wydanie II
JavaScript. Ćwiczenia praktyczne. Wydanie IIWydawnictwo Helion
 
Integracja systemow od strony praktycznej
Integracja systemow od strony praktycznejIntegracja systemow od strony praktycznej
Integracja systemow od strony praktycznejMarek Horbań
 
Lets Flex The Web
Lets Flex The WebLets Flex The Web
Lets Flex The Webguestc437d2
 
Aplikacje internetowe (2010)
Aplikacje internetowe (2010)Aplikacje internetowe (2010)
Aplikacje internetowe (2010)Adrian Kalbarczyk
 

Ähnlich wie Ajax. Ćwiczenia (20)

AJAX i PHP. Tworzenie interaktywnych aplikacji internetowych
AJAX i PHP. Tworzenie interaktywnych aplikacji internetowychAJAX i PHP. Tworzenie interaktywnych aplikacji internetowych
AJAX i PHP. Tworzenie interaktywnych aplikacji internetowych
 
Tworzenie stron WWW z wykorzystaniem Ajaksa. Projekty
Tworzenie stron WWW z wykorzystaniem Ajaksa. ProjektyTworzenie stron WWW z wykorzystaniem Ajaksa. Projekty
Tworzenie stron WWW z wykorzystaniem Ajaksa. Projekty
 
AJAX w mgnieniu oka
AJAX w mgnieniu okaAJAX w mgnieniu oka
AJAX w mgnieniu oka
 
Nowe Trendy W Projektowaniu Aplikacji Webowych
Nowe Trendy W Projektowaniu Aplikacji WebowychNowe Trendy W Projektowaniu Aplikacji Webowych
Nowe Trendy W Projektowaniu Aplikacji Webowych
 
Scala
ScalaScala
Scala
 
Paleta możliwości web developera
Paleta możliwości web developeraPaleta możliwości web developera
Paleta możliwości web developera
 
Serwery WWW - wykład
Serwery WWW - wykładSerwery WWW - wykład
Serwery WWW - wykład
 
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
 
Silverlight i PHP
Silverlight i PHPSilverlight i PHP
Silverlight i PHP
 
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
 
HTML5: Atak i obrona
HTML5: Atak i obronaHTML5: Atak i obrona
HTML5: Atak i obrona
 
Delphi. Techniki bazodanowe i internetowe
Delphi. Techniki bazodanowe i internetoweDelphi. Techniki bazodanowe i internetowe
Delphi. Techniki bazodanowe i internetowe
 
JavaScript. Ćwiczenia praktyczne. Wydanie II
JavaScript. Ćwiczenia praktyczne. Wydanie IIJavaScript. Ćwiczenia praktyczne. Wydanie II
JavaScript. Ćwiczenia praktyczne. Wydanie II
 
Integracja systemow od strony praktycznej
Integracja systemow od strony praktycznejIntegracja systemow od strony praktycznej
Integracja systemow od strony praktycznej
 
Lets Flex The Web
Lets Flex The WebLets Flex The Web
Lets Flex The Web
 
Aplikacje internetowe (2010)
Aplikacje internetowe (2010)Aplikacje internetowe (2010)
Aplikacje internetowe (2010)
 
XHTML & CSS, WAI
XHTML & CSS, WAIXHTML & CSS, WAI
XHTML & CSS, WAI
 
XML w SQL Server w praktyce
XML w SQL Server w praktyceXML w SQL Server w praktyce
XML w SQL Server w praktyce
 
Android i REST
Android i RESTAndroid i REST
Android i REST
 
PHP5 i MySQL. Biblia
PHP5 i MySQL. BibliaPHP5 i MySQL. Biblia
PHP5 i MySQL. Biblia
 

Mehr von Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

Mehr von Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

Ajax. Ćwiczenia

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TREœCI Ajax. Æwiczenia Autor: Marcin Lis KATALOG KSI¥¯EK ISBN: 83-246-0686-6 Format: A5, stron: 168 KATALOG ONLINE Przyk³ady na ftp: 32 kB ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK DODAJ DO KOSZYKA Ajax to nowe podejœcie do tworzenia witryn internetowych bazuj¹ce na ró¿norodnych technologiach, takich jak HTML i JavaScript, obiekty XMLHttpRequest, style CSS, model DOM czy XML. Charakterystyczne dla stron budowanych zgodnie z tym CENNIK I INFORMACJE podejœciem jest to, ¿e nie wymagaj¹ one prze³adowywania. Dziêki temu, ¿e przesy³ane s¹ tylko niezbêdne dane, takie witryny internetowe dzia³aj¹ w sposób zbli¿ony do ZAMÓW INFORMACJE standardowych aplikacji. Daje to wiele nowych mo¿liwoœci, dlatego Ajax zas³u¿enie O NOWOœCIACH szybko zyska³ du¿¹ popularnoœæ. „Ajax. Æwiczenia” to zbiór praktycznych æwiczeñ pokazuj¹cych, jak za pomoc¹ ZAMÓW CENNIK technologii zwi¹zanych z Ajaksem oraz jêzyka PHP wykonywaæ operacje pozwalaj¹ce tworzyæ bardziej reaktywne witryny. Wykonuj¹c kolejne æwiczenia, nauczysz siê miêdzy innymi wysy³aæ i pobieraæ dane za pomoc¹ obiektów XMLHttpRequest oraz dynamicznie CZYTELNIA aktualizowaæ strony. Dowiesz siê, w jaki sposób Ajax wspó³pracuje ze skryptami PHP oraz jak obs³ugiwaæ dane XML. Poznasz tak¿e wiele ró¿nych technik pozwalaj¹cych FRAGMENTY KSI¥¯EK ONLINE na efektywne przesy³anie informacji miêdzy serwerem a przegl¹dark¹ w synchroniczny i asynchroniczny sposób. Dziêki lekturze tej ksi¹¿ki nauczysz siê tworzyæ bogatsze i bardziej reaktywne witryny internetowe. • Przesy³anie danych za pomoc¹ obiektów XMLHttpRequest • Wspó³praca Ajaksa z PHP • Obs³uga danych XML • Przesy³anie danych w ró¿nych formatach • Generowanie kodu po stronie serwera • Obiekty JSON Tchnij wiêcej ¿ycia w swoje witryny internetowe Wydawnictwo Helion ul. Koœciuszki 1c 44-100 Gliwice tel. 032 230 98 63 e-mail: helion@helion.pl
  • 2. Spis treści Wstęp 5 Rozdział 1. Podstawy 9 Pierwsze kroki z AJAX-em 9 Obiekt XMLHttpRequest 12 Właściwości i metody obiektu XMLHttpRequest 17 Wysyłanie żądania do serwera 21 Przesyłanie danych między przeglądarką a serwerem 23 Transmisja synchroniczna 31 Inne sposoby tworzenia obiektu XMLHttpRequest 33 Rozdział 2. Kolejne kroki z AJAX-em 39 Pobieranie danych z różnych plików 39 Co nieco o obrazach 45 Dynamiczne zmiany na stronie 53 Rozdział 3. AJAX i skrypty serwera (PHP) 59 AJAX i PHP 59 Wysyłanie danych do serwera metodą GET 67 Wysyłanie danych do serwera metodą POST 79 AJAX i PHP w praktyce 87
  • 3. 4 Ajax • Ćwiczenia Rozdział 4. AJAX i XML 105 Krótko o XML 105 Reprezentacja dokumentów XML 107 Odbieranie danych XML 110 Dynamiczne listy wyboru 120 AJAX, XML i PHP 126 Rozdział 5. Równoległa obsługa wielu żądań 133 Problemy z równoległą obsługą żądań 133 Użycie kilku obiektów XMLHttpRequest 140 Wykorzystanie funkcji wewnętrznych 143 Rozdział 6. Kiedy serwer odpowiada kodem 147 Serwer wysyła kod 147 Obiekty w standardzie JSON 157
  • 4. 4 AJAX i XML Krótko o XML Skrót AJAX oznacza Asynchronous Javascript and XML — z samej nazwy wynika więc, że technika ta jest związana z językiem XML. Co prawda, jak pokazały poprzednie rozdziały, stosowanie XML-a wcale nie jest konieczne do tworzenia aplikacji AJAX-a, warto jednak wiedzieć, jak wygląda współpraca między XML-em i AJAX-em oraz jak się tworzy, pobiera i przetwarza tego typu dane. Takim właśnie zagadnieniom po- święcony jest czwarty rozdział. XML to EXtensible Markup Language, czyli rozszerzalny język znacz- ników. Jest to rozwijany przez organizację W3C (http://www.w3.org) niezależny od platformy systemowej język opisu danych. Faktycznie XML służy do wyprowadzania innych języków, tzw. aplikacji XML. Pozwala na definiowanie struktury danych, struktury dokumentów, zupełnie niezależnej od sposobu ich prezentacji, jak jest np. w HTML. Nie ma w nim też narzuconego z góry zestawu znaczników. I to jest jego największa siła. Dzięki tym cechom umożliwia łatwą wymianę danych oraz bezproblemowe ich przetwarzanie. Dokument XML składa się z nagłówka oraz zbioru znaczników defi- niujących elementy dokumentu. Każdy element musi mieć znacznik otwierający i zamykający, np.:
  • 5. 106 Ajax • Ćwiczenia <element1> dane </element1> chyba że jest elementem pustym (czyli niezawierającym danych). W tym ostatnim przypadku znacznik będzie miał postać: <znacznik /> W nagłówku należy natomiast określić wersję języka. W dalszych ćwi- czeniach będziemy stosować nagłówek w postaci: <?xml version="1.0" ?> Elementy dokumentu XML mogą być zagnieżdżane (podobnie jak znacz- niki HTML), np.: <element1> <element2> dane </element2> </element1> Mogą także posiadać atrybuty, choć w niniejszej publikacji nie bę- dziemy ich stosować. Jak może wyglądać prosty dokument XML? Na przykład następująco: <?xml version="1.0" ?> <dokument> To jest pierwszy dokument! </dokument> Mamy tu znacznik otwierający <dokument> i zamykający </dokument>. Te znaczniki definiują element XML o nazwie dokument, natomiast tekst znajdujący się między nimi to zawartość tego elementu. Przy czym <dokument> bynajmniej nie jest predefiniowanym elementem języka — jest to nasz własny znacznik, który sobie wymyśliliśmy. Równie dobrze można go nazwać np. napis: <?xml version="1.0" ?> <napis> To jest pierwszy dokument! </napis> Te wiadomości wystarczą już do wykonania ćwiczeń znajdujących się na kolejnych stronach.
  • 6. Rozdział 4. • AJAX i XML 107 Reprezentacja dokumentów XML W poprzednich rozdziałach zaprezentowano wiele ćwiczeń pokazują- cych, w jaki sposób odbierać dane tekstowe za pomocą obiektu XMLHttp- Request. Dane te były zarówno statyczne, jak i generowane dynamicz- nie, jednak dostęp do nich zawsze był uzyskiwany przez odwołanie się do właściwości responseText. Jeśli zajrzymy teraz do tabeli 1.1 z roz- działu 1., znajdziemy w niej również właściwość responseXML. Właśnie ona zawiera dane w formacie XML, o ile oczywiście w takiej formie zostały przesłane z serwera. W rzeczywistości właściwość ta zawiera obiekt posiadający właściwości pozwalające na dostęp do danych za- wartych w pobranym dokumencie XML. Typowe właściwości zostały przedstawione w tabeli 4.1. Tabela 4.1. Właściwości pozwalające na dostęp do struktury dokumentu XML Nazwa Opis attributes Atrybuty węzła childNodes Tablica węzłów potomnych documentElement Główny element dokumentu firstChild Pierwszy węzeł potomny lastChild Ostatni węzeł potomny localName Lokalna nazwa węzła name Nazwa węzła nextSibling Kolejny węzeł sąsiadujący nodeName Nazwa węzła nodeType Typ węzła nodeValue Wartość węzła previousSibling Poprzedni węzeł sąsiadujący Aby zrozumieć znacznie tych właściwości, trzeba wiedzieć, że doku- ment XML w obiekcie wskazanym przez właściwość responseXML jest traktowany jako struktura drzewiasta, w której poszczególne elementy dokumentu są węzłami. Załóżmy, że mamy do dyspozycji dokument XML w postaci:
  • 7. 108 Ajax • Ćwiczenia <?xml version="1.0" ?> <osoba> <imie> Jan </imie> <nazwisko> Kowalski </nazwisko> </osoba> Będzie on reprezentowany jako struktura widoczna na rysunku 4.1. Rysunek 4.1. Drzewiasta struktura dokumentu XML Jak widać, taki dokument posiada węzeł (ang. node) odpowiadający elementowi <osoba>, zaś węzeł ten posiada dwa podwęzły (ang. sub- nodes), czyli węzły potomne (ang. child nodes): <imie> i <nazwisko>. Każdy z węzłów potomnych posiada dodatkowo podwęzeł przecho- wujący tekstowe dane zdefiniowane w elementach <imie> i <nazwisko>. Wynika z tego, że: węzeł <osoba> jest węzłem głównym, właściwość firstChild węzła <osoba> to węzeł <imie>, właściwość lastChild węzła <osoba> to węzeł <nazwisko>, właściwość firstChild węzła <imie> to węzeł tekstowy zawierający ciąg znaków Jan, właściwość firstChild węzła <nazwisko> to węzeł tekstowy zawierający ciąg znaków Kowalski, właściwość nextSibling węzła <imie> to węzeł <nazwisko>, właściwość previousSibling węzła <nazwisko> to węzeł <imie> itd. Tak więc, jeśli odbierzemy dane i dokonamy przypisania: var xml = XMLHttpRequestObject.responseXML; to aby dostać się do węzła <osoba>, napiszemy: xml.documentElement
  • 8. Rozdział 4. • AJAX i XML 109 Aby dostać się do węzła <imie>, wpiszemy: xml.documentElement.firstChild bowiem węzeł <imie> jest pierwszym węzłem potomnym (firstChild) węzła <osoba>. Aby dostać się do węzła <nazwisko>, napiszemy: xml.documentElement.lastChild bowiem węzeł <nazwisko> jest ostatnim węzłem potomnym (lastChild) węzła <osoba>. Aby dostać się do węzła tekstowego zawierającego imię, napiszemy: xml.documentElement.firstChild.firstChild bowiem węzeł ten jest pierwszym (i zarazem jedynym) węzłem po- tomnym węzła <imie>. Można by przytoczyć jeszcze kilka innych konstrukcji (np. wykorzy- stujących węzły sąsiadujące), nie ma chyba jednak takiej potrzeby — zasady dostępu z pewnością są już jasne. Niestety powyższy opis sprawdzi się w pełni tylko w przypadku prze- glądarki Internet Explorer. Przeglądarki oparte na module Gecko (np. Firefox), ale również np. Opera nieco inaczej interpretują dane XML. Otóż białe znaki (a więc znaki końca linii, tabulacji, spacje itp.) znaj- dujące się w treści dokumentu pomiędzy znacznikami są traktowane jako węzły tekstowe. Stąd przedstawiony wyżej dokument — jako obiekt XML w przeglądarce — będzie miał postać przedstawioną na rysunku 4.2. Rysunek 4.2. Struktura dokumentu XML w przeglądarkach Firefox, Opera itp. Tak więc w tym przypadku węzeł <osoba> również jest węzłem głów- nym, ale pierwszym węzłem potomnym jest węzeł tekstowy zawiera- jący znak końca linii i spacje. Dopiero pierwszym sąsiadem tego węzła jest węzeł <imie>. Jeśli zatem odbierzemy dane i dokonamy przypisania: var xml = XMLHttpRequestObject.responseXML;
  • 9. 110 Ajax • Ćwiczenia to aby dostać się do węzła <osoba>, napiszemy: xml.documentElement Aby dostać się do węzła <imie>, wpiszemy: xml.documentElement.firstChild.nextSibling bowiem węzeł <imie> jest kolejnym węzłem sąsiadującym (nextSibling) z pierwszym węzłem potomnym (firstChild) węzła <osoba>. Aby dostać się do węzła <nazwisko>, napiszemy: xml.documentElement.lastChild.previousSibling bowiem węzeł <nazwisko> jest przedostatnim węzłem potomnym (czyli wcześniejszym węzłem sąsiadującym ostatniego węzła potomnego) węzła <osoba>. Aby dostać się do węzła tekstowego zawierającego imię, napiszemy: xml.documentElement.firstChild.nextSibling.firstChild bowiem węzeł ten jest pierwszym (i zarazem jedynym) węzłem po- tomnym węzła <imie>. Jak widać, czasami niezbędne może okazać się pisanie dwóch wersji kodu, obsługujących dwa przedstawione sposoby reprezentacji danych. Jednak w wielu przypadkach uda nam się obejść te ograniczenia i utwo- rzyć kod działający poprawnie w obu rodzajach przeglądarek. Pomoc- na może być w tym właściwość nodeType każdego węzła, pozwalająca określić jego typ. Typy węzłów i odpowiadające im wartości zostały przedstawione w tabeli 4.2. Ich znajomość przyda się przy wykonywa- niu jednego z ćwiczeń przedstawionych w kolejnym podrozdziale. Odbieranie danych XML Dwa poprzednie podrozdziały zawierały wiele informacji na temat XML-a i sposobu reprezentacji dokumentów tego typu w przeglądarkach. Czas wykorzystać tę wiedzę i wykonać pierwszy przykład, który pokaże, jak za pomocą AJAX-a pobrać dane znajdujące się w pliku tekstowym zawierającym dokument XML oraz wyświetlić je na ekranie przeglądarki.
  • 10. Rozdział 4. • AJAX i XML 111 Tabela 4.2. Typy węzłów dokumentu XML Wartość Typ węzła 1 Element 2 Atrybut 3 Węzeł tekstowy 4 Sekcja CDATA 5 Referencja do encji 6 Węzeł encji 7 Instrukcje przetwarzania XML 8 Komentarz XML 9 Węzeł dokumentu XML 10 Definicja typu dokumentu 11 Część dokumentu XML 12 Notacja XML Ć W I C Z E N I E 4.1 Pobieranie danych XML Napisz skrypt pobierający z serwera dane w formacie XML i wyświe- tlający je na ekranie. Najpierw należy przygotować plik w formacie XML. Będzie on miał bardzo prostą postać: <?xml version="1.0" ?> <imie> Anna </imie> Cała zawartość takiego dokumentu to jeden element (określony przez znacznik <imie>) zawierający dane o imieniu Anna. Przedstawioną treść należy zapisać w pliku index.xml. Jak pobrać w tle i przetworzyć takie dane, pokazuje skrypt widoczny na poniższym listingu:
  • 11. 112 Ajax • Ćwiczenia <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> <title>Ajax</title> <script type="text/javascript"> var XMLHttpRequestObject = false; if(window.XMLHttpRequest){ XMLHttpRequestObject = new XMLHttpRequest(); } else if(window.ActiveXObject){ XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP"); } function pobierzDane(dest) { if(XMLHttpRequestObject){ var div = document.getElementById(dest); var url = "http://localhost/index.xml"; XMLHttpRequestObject.open("GET", url); XMLHttpRequestObject.onreadystatechange = function() { if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200){ var xml = XMLHttpRequestObject.responseXML; var imie = xml.documentElement.firstChild.nodeValue; var str = "Imię odczytane z dokumentu XML to: " + imie; div.innerHTML = str; } } XMLHttpRequestObject.send(null); } } </script> </head> <body> <input type="button" value="Kliknij tu" onclick="pobierzDane('dataDiv');" /> <hr> </div> <div id="dataDiv"> Ten tekst zostanie zmieniony. </div> </body> </html>
  • 12. Rozdział 4. • AJAX i XML 113 Na stronie znajduje się przycisk, któremu została przypisana procedura obsługi zdarzenia onclick w postaci funkcji pobierzDane oraz warstwa o identyfikatorze dataDiv służąca do wyświetlania danych. Funkcja pobierzDane przyjmuje jeden argument określający identyfikator war- stwy, na której mają pojawić się wyniki jej działania. W jej wnętrzu na początku wykonywane są typowe operacje niezbędne do transmisji i przetwarzania danych, czyli pobranie obiektu warstwy wskazywanej przez argument dest: var div = document.getElementById(dest); podanie adresu wskazującego plik XML, który ma zostać pobrany: var url = "http://localhost/index.xml"; oraz zainicjowanie żądania za pomocą metody open: XMLHttpRequestObject.open("GET", url); Dane tradycyjnie odczytywane są za pomocą funkcji anonimowej przy- pisanej właściwości onreadystatechange obiektu XMLHttpRequestObject. W przeciwieństwie jednak do przykładów prezentowanych we wcze- śniejszych rozdziałach, odczyt następuje przez odwołanie się do wła- ściwości responseXML: var xml = XMLHttpRequestObject.responseXML; Po wykonaniu takiej instrukcji zmienna xml będzie zawierała obiekt odzwierciedlający strukturę dokumentu XML. Ponieważ nasz dokument ma bardzo prostą strukturę, gdzie elementem głównym jest znacznik <imie>, to dostęp do tego znacznika osiągamy przez odwołanie się do właściwości documentElement, natomiast dostęp do węzła tekstowego zawierającego imię — przez odwołanie się do właściwości firstChild. nodeValue. Jest to realizowanie przez instrukcję: var imie = xml.documentElement.firstChild.nodeValue; Odczytana wartość węzła tekstowego jest następnie wykorzystywana do skonstruowania napisu, który pojawi się na stronie. Jest on zapi- sywany w zmiennej str: var str = "Imię odczytane z dokumentu XML to: " + imie; Z kolei wartość zmiennej str jest przypisywana właściwości in- nerHTML warstwy wskazywanej przez obiekt div: div.innerHTML = str; Ostatecznie po kliknięciu przycisku zobaczmy widok przedstawiony na rysunku 4.3.
  • 13. 114 Ajax • Ćwiczenia Rysunek 4.3. Dane pobrane z dokumentu XML zostały wyświetlone na stronie Ćwiczenie 4.1 pokazało, w jaki sposób odebrać dane w formacie XML i wyświetlić je na witrynie. Struktura dokumentu była jednak bardzo prosta, nie występowały więc żadne problemy związane z różnymi spo- sobami reprezentacji danych stosowanych w przeglądarkach, a opisa- nych w poprzednim podrozdziale. Spróbujmy zatem poprawnie prze- tworzyć nieco bardziej złożony dokument zawierający zagnieżdżone znaczniki. Ć W I C Z E N I E 4.2 Przetwarzanie dokumentu XML Napisz skrypt przetwarzający dane z dokumentu XML zawierającego kilka zagnieżdżonych znaczników. Dokument XML, który wykorzystamy w tym ćwiczeniu (należy go za- pisać w pliku index.xml), będzie miał postać: <?xml version="1.0" ?> <imiona> <imie> Anna </imie> <imie> Magdalena </imie> <imie> Jolanta </imie> </imiona> Nie jest on bardzo skomplikowany, jest to jednak struktura drzewiasta, bardziej złożona niż w poprzednim ćwiczeniu. Widzimy, że elementem głównym jest znacznik <imiona>. Wewnątrz niego za pomocą znaczni- ków <imie> zostały zdefiniowane trzy kolejne elementy, a każdy z tych elementów zawiera dane tekstowe. Możemy być zatem pewni, że Inter-
  • 14. Rozdział 4. • AJAX i XML 115 net Explorer zinterpretuje te dane inaczej niż Firefox czy Opera. Pierw- szym pomysłem, który się nasuwa, jest rozpoznanie typu przeglądarki (co i tak wykonujemy podczas tworzenia obiektu XMLHttpRequest) oraz napisanie dwóch różnych wersji kodu. W tym przypadku nie musimy jednak tak postępować. Zamiast tego wystarczy bowiem odpowiednio wykorzystać właściwości childNodes i nodeType, tak jak zostało to wyko- nane w poniższym skrypcie: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> <title>Ajax</title> <script type="text/javascript"> var XMLHttpRequestObject = false; if(window.XMLHttpRequest){ XMLHttpRequestObject = new XMLHttpRequest(); } else if(window.ActiveXObject){ XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP"); } function przetwarzajXML(xml, dest) { var div = document.getElementById(dest); var imiona = xml.documentElement.childNodes; var str = "Imiona odczytane z danych XML: <br />"; for(var i = 0; i < imiona.length; i++){ if(imiona[i].nodeType == 1){ str += imiona[i].firstChild.nodeValue + "<br />"; } } div.innerHTML = str; } function pobierzDane(dest) { if(XMLHttpRequestObject){ var url = "http://localhost/index.xml"; XMLHttpRequestObject.open("GET", url); XMLHttpRequestObject.onreadystatechange = function() { if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200){ var xml = XMLHttpRequestObject.responseXML;
  • 15. 116 Ajax • Ćwiczenia przetwarzajXML(xml, dest); } } XMLHttpRequestObject.send(null); } } </script> </head> <body> <input type="button" value="Kliknij tu" onclick="pobierzDane('dataDiv');" /> <hr> </div> <div id="dataDiv"> Ten tekst zostanie zmieniony. </div> </body> </html> Przycisk oraz warstwa z danymi zostały zdefiniowane w taki sam spo- sób jak w poprzednim ćwiczeniu. Funkcja pobierzDane ma również po- dobną strukturę. Pewnym zmianom uległa natomiast funkcja ano- nimowa przypisana właściwości onreadystatechange obiektu XMLHttp- RequestObject. Najpierw pobiera ona obiekt XML będący reprezentacją danych przesłanych z serwera: var xml = XMLHttpRequestObject.responseXML; a następnie przekazuje go w postaci argumentu funkcji przetwarzajXML zajmującej się przetwarzaniem i interpretacją danych: przetwarzajXML(xml, dest); Drugim argumentem jest identyfikator warstwy, na której ma się po- jawić tekst wynikowy. Funkcja przetwarzajXML najpierw pobiera obiekt warstwy (i przypisuje go zmiennej div): var div = document.getElementById(dest); a następnie tablicę zawierającą węzły potomne węzła głównego (jest ona zapisana we właściwości childNodes): var imiona = xml.documentElement.childNodes; Ponieważ węzłem głównym jest w tym przypadku <imiona>, tablica ta będzie zawierała elementy zdefiniowane za pomocą znaczników <imie> oraz — w przypadku przeglądarek innych niż Internet Explorer — węzły tekstowe. Pozostaje więc znaleźć sposób na odróżnienie ich
  • 16. Rozdział 4. • AJAX i XML 117 od siebie i pobranie danych tylko węzłów typu <imie>. Ta czynność wykonywana jest w pętli for: for(var i = 0; i < imiona.length; i++){ Przechodzi ona wszystkie elementy tablicy imiona, począwszy od ele- mentu pierwszego, o indeksie 0, aż do ostatniego, o indeksie imiona. length – 1 (o jeden mniejszym niż całkowity rozmiar tablicy zapisany we właściwości lenght). We wnętrzu pętli za pomocą instrukcji warunkowej if sprawdzany jest typ węzła zapisany we właściwości nodeType każdego z nich. W przy- padku naszego dokumentu będziemy mieli do czynienia z dwoma typami węzłów: typem 1 — definiującym element XML (czyli określonym za pomocą znaczników <imie>), typem 3 — tekstowym. Tak więc odwołanie do imion ma sens tylko wtedy, kiedy aktualnie przetwarzany węzeł ma typ równy 1: if(imiona[i].nodeType == 1){ W takim przypadku, ponieważ mamy wtedy do czynienia z elementem <imie>, trzeba się odwołać do pierwszego (i jedynego) węzła potom- nego zawierającego dane konkretnego imienia. Dane te są dopisywane do zmiennej str: str += imiona[i].firstChild.nodeValue + "<br />"; Dzięki temu po zakończeniu pętli mogą być one wyświetlone na dol- nej warstwie, tak jak jest to widoczne na rysunku 4.4. Rysunek 4.4. Imiona odczytane z dokumentu XML
  • 17. 118 Ajax • Ćwiczenia Oprócz przedstawionego wyżej sposobu pobierania danych, niezależ- nego do przeglądarki, jaka jest do tego wykorzystywana, istnieje także inny. Otóż zamiast przeglądać „ręcznie” strukturę dokumentu, moż- na wykorzystać metodę getElementsByTagName, która pobierze wszyst- kie węzły o zadanej nazwie i zwróci je w postaci tablicy. Wystarczy więc wywołać ją na rzecz obiektu odzwierciedlającego strukturę do- kumentu (zapisanego we właściwości responseXML), aby otrzymać dane poszukiwanych węzłów bez konieczności sprawdzania ich typów. Jak to zrobić, pokaże kolejne ćwiczenie. Ć W I C Z E N I E 4.3. Użycie metody getElementsByTagName Zmodyfikuj kod ćwiczenia 4.2, tak aby do przetwarzania danych zo- stała użyta metoda getElementsByTagName. Treść dokumentu XML pozostanie taka sama jak w poprzednim ćwi- czeniu, natomiast kod skryptu będzie miał następującą postać: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> <title>Ajax</title> <script type="text/javascript"> var XMLHttpRequestObject = false; if(window.XMLHttpRequest){ XMLHttpRequestObject = new XMLHttpRequest(); } else if(window.ActiveXObject){ XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP"); } function przetwarzajXML(xml, dest) { var div = document.getElementById(dest); var imiona = xml.getElementsByTagName('imie'); var str = "Imiona odczytane z danych XML: <br />"; for(var i = 0; i < imiona.length; i++){ var imie = imiona[i].firstChild.nodeValue; str += imie + "<br />"; } div.innerHTML = str; }
  • 18. Rozdział 4. • AJAX i XML 119 function pobierzDane(dest) { if(XMLHttpRequestObject){ var url = "http://localhost/index.xml"; XMLHttpRequestObject.open("GET", url); XMLHttpRequestObject.onreadystatechange = function() { if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200){ var xml = XMLHttpRequestObject.responseXML; przetwarzajXML(xml, dest); } } XMLHttpRequestObject.send(null); } } </script> </head> <body> <input type="button" value="Kliknij tu" onclick="pobierzDane('dataDiv');" /> <hr> </div> <div id="dataDiv"> Ten tekst zostanie zmieniony. </div> </body> </html> Ogólna struktura skryptu jest taka sama jak w ćwiczeniu 4.2, zmianie uległa jednak treść funkcji przetwarzajXML. Po pobraniu obiektu warstwy docelowej o identyfikatorze wskazywanym przez argument dest: var div = document.getElementById(dest); następuje wywołanie metody getElementsByTagName operującej na obiekcie dokumentu XML: var imiona = xml.getElementsByTagName('imie'); Argumentem wywołania tej metody jest ciąg znaków określający, jakie elementy (węzły) dokumentu chcemy pobrać (w tym przypadku są to elementy zdefiniowane przez znaczniki <imie>), natomiast wynikiem działania jest tablica węzłów. Ta tablica przypisywana jest zmiennej imiona. Odczytanie imion odbywa się w pętli for, która przebiega wszystkie elementy tablicy: for(var i = 0; i < imiona.length; i++){
  • 19. 120 Ajax • Ćwiczenia Ponieważ w każdej komórce znajduje się jeden węzeł zdefiniowany za pomocą znacznika <imie>, to dane dotyczące imienia odnajdziemy w pierwszym węźle potomnym, czyli we właściwości firstChild.node- Value: var imie = imiona[i].firstChild.nodeValue; Każde odczytane imię jest zapisywane w zmiennej pomocniczej imie, która następnie wykorzystywana jest przy tworzeniu ciągu zapisywa- nego w zmiennej str: str += imie + "<br />"; który po zakończeniu pętli zostanie wyświetlony na warstwie do- celowej: div.innerHTML = str; Dynamiczne listy wyboru Skoro wiemy już, w jaki sposób pobierać i przetwarzać dane XML, mo- żemy wykonać ćwiczenie wykorzystujące tę technikę do budowania dynamicznych list wyboru. Listy takie są standardowo tworzone za pomocą znacznika <select>, a wszystkie zawarte w nich opcje umiesz- czane są w pliku HTML za pomocą serii znaczników <option>. Nic nie stoi jednak na przeszkodzie, aby opcje zostały zapisane w pliku XML i były pobierane w tle dopiero na żądanie użytkownika. Taki efekt reali- zowany jest w ćwiczeniu 4.4. Do wykonania tego ćwiczenia niezbędna jest znajomość dynamicznego tworzenia opcji w listach rozwijalnych. Na szczęście nie jest to skomplikowane. Każda lista ma właściwość options zawierającą dostępne na niej opcje. Zakładając więc, że obiekt listy jest zawarty w zmiennej lista, do pierwszej (o indeksie 0) pozycji listy odwołamy się, pisząc: lista. options[0], do drugiej — lista.options[1] itd. Tablica options posiada z kolei właściwość length, która zawiera całkowitą liczbę opcji. Co waż- ne, przypisanie tej właściwości wartości 0: lista.options.length = 0; spowoduje usunięcie wszystkich pozycji z listy. Jeśli chcemy dodać nową pozycję do listy, należy utworzyć obiekt typu Option i przypisać go tej pozycji. Schematyczne wywołanie konstruktora ma postać: