Základ fungovania AJAXu
Pre komunikáciu stránky (resp. JavaScriptu) so serverom slúži natívny objekt XMLHttpRequest.
Aj keď tento objekt vznikol už pred rokom 2000, jeho masové využitie v AJAXe sa
objavuje neskôr a samotný termín AJAX sa prvýkrát objavuje r. 2005.
Popíšme si najprv samotný objekt XMLHttpRequest. Už pri jeho interpretácii v prehliadačoch
sa síce stretávame s prvým problémom (hlavne pre odlišný prístup IE), ale jeho deklarácia
môže vyzerať napr. nejako takto:
if(typeof window.ActiveXObject != 'undefined')
{
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
httpRequest = new XMLHttpRequest();
}
Metódy a vlastnosti objektu XMLHttpRequest, ktoré sú pre náš jednoduchý príklad
podstatné:
- open(sMethod, sUrl [, bAsync]) - Pomocou tejto metódy určujeme
typ spracovania požiadavku (GET alebo POST), adresu stránky, ktorá sa spracuje na
serveri a to, či sa požiadavok spracuváva asynchrónne (to znamená, že po zavolaní
metódy send() sa skript spracuváva ďalej a nečaká sa na výstup od servera).
- send (content) - Metóda odošle požiadavok s príslušným obsahom.
- onreadystatechange - V tejto vlastnosti definujeme funkciu (JavaScriptu),
ktorá obsluhuje udalosť zmeny stavu objektu.
- readystate - vlastnosť vracia stav objektu, tento stav môže nadobúdať
tieto hodnoty: 0 - neinicializované, 1 - načítavam, 2 - načítané, 3 - spracúvavam,
4 - hotovo.
- responseText - vracia odpoveď ako reťazec spolu s údajmi, ktoré
zaslal server.
- responseXML - vracia odpoveď v podobe XML dokumentu.
- status - návratový kód odpovede (napr. 404).
- statusText - doprevádza kód odpovede sprievodným textom.
Vyskúšajme si teraz teóriu v praxi, vložme do stránky nejaký prvok (pre jednoduchosť
len čistý html select). Tento select nám dá na výber z dvoch možností, zobraziť
text1 a text2. Po kliknutí na jednu z možností sa nám jeho podoba zobrazí pod select
a to práve pomocou AJAXu bez znovunačítania stránky. Výsledok si môžete pozrieť
na stránke.
Pozrime sa bližšie na kód, ktorý sa volá pri akejkoľvek zmene v selecte:
function ajax()
{
var url = document.getElementById("vyber").value;
if (url != 0)
{
if (window.ActiveXObject)
{
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
httpRequest = new XMLHttpRequest();
}
httpRequest.open("GET", url, true);
httpRequest.onreadystatechange = function() {processRequest();}
httpRequest.send(null);
}
else{document.getElementById("miestoZobrazenia").innerHTML = "";
}
}
function processRequest()
{
if (httpRequest.readyState == 4)
{
if(httpRequest.status == 200)
{
var miestoZobrazenia = document.getElementById("miestoZobrazenia");
miestoZobrazenia.innerHTML = httpRequest.responseText;
}
else
{
alert(httpRequest.status);
alert("Chyba pri nacitani stanky"+ httpRequest.status +":"+ httpRequest.statusText);
}
}
}
Ako vidíme, po zavolaní funkcie ajax() sa nám vytvorí príslušný objekt XMLHttpRequest.
Metódou GET sa odošle požiadavok na adresu, ktorú sme zvolili sami v našom selecte.
Zároveň definujeme výkonnú funkciu (processRequest) na spracovanie výstupu.
Metóda processRequest nám potom v prípade, že sme už obdržali celý balík dát od
servera a je všetko v poriadku, vloží do pripraveného div-u miestoZobrazenia text,
ktorý je vlastne výstupom požadovanej stránky.
V pripravenom príklade sú volané stránky veľmi primitívne, obsahujú len krátky text,
aby sa dalo rozlíšiť, ktorá z nich je práve zobrazovaná. Cieľom bolo ukázať, že
práve načítanie týchto stránok sa deje bez nutnosti znovunačítať stránku pôvodnú.