Crmgo Blog

AJAX. Osnove.

AJAX. Osnove.

AJAX (ајакс) је веб технологија која омогућава комуникацију са сервером без освежавања странице. Примери примене укључују проверу да ли је корисничко име слободно током регистрације, додавање производа у корпу без освежавања странице, Google предлоге итд. AJAX се заснива на објекту XMLHttpRequest. Као што се види…

AJAX. Osnove.

AJAX (аякс) je web tehnologija koja omogućava interakciju sa serverom bez osvežavanja stranice. Primeri upotrebe uključuju proveru da li je korisničko ime zauzeto prilikom registracije, slanje proizvoda u korpu bez osvežavanja, Google Suggest i slično. AJAX se zasniva na objektu XMLHttpRequest. Kao što se vidi iz naziva, on je zamišljen za rad sa XML-om, što, međutim, ne sprečava njegovu upotrebu i u druge svrhe.

Princip rada je sledeći:
skripta se sastoji od dva dela

  1. klijentski deo: izvršava se na strani klijenta, piše se u JavaScript-u
  2. server-side deo: izvršava se na serveru, može biti napisan u bilo kom programskom jeziku koji razume GET/POST zahteve

Faze pisanja klijentskog dela:

  1. prikupljanje i priprema informacija za slanje zahteva na server;
  2. kreiranje instance objekta XMLHttpRequest;
  3. postavljanje funkcije za obradu događaja onreadystatechange. Ovaj događaj se javlja pri svakoj promeni stanja objekta XMLHttpRequest (vidi tabelu ispod). Ova funkcija je zapravo glavni deo skripte, jer se u njoj obrađuje odgovor servera;
  4. otvaranje konekcije uz navođenje tipa zahteva (GET ili POST), URL server-side dela, zastavice asinhronog režima i imena i lozinke korisnika (ako je potrebno);
  5. direktno slanje zahteva;
  6. obrada odgovora server-side dela.

Kreiranje objekta XMLHttpRequest razlikuje se za Internet Explorer i druge pretraživače, stoga se ova operacija mora duplirati različitim načinima radi kompatibilnosti:

01var req;
02
03if (window.XMLHttpRequest)  // normal browser
04req = new XMLHttpRequest();  
05else if (window.ActiveXObject) {    //IE
06try {
07req = new ActiveXObject('Msxml2.XMLHTTP');  // IE разных версий
08} catch (e){}                                   // может создавать
09try {                                           // объект по разному
10req = new ActiveXObject('Microsoft.XMLHTTP');
11} catch (e){}
12}

Korišćenje GET metode, postavljanje obrade događaja onreadystatechange i slanje zahteva:

1req.open("GET", url, true);
2req.onreadystatechange = function() {
3if (req.readyState == 4)  { обработка результатов }       
4}; 
5req.send(null); //отправка запроса без параметров, т.к. они установлены в url     

U obradi događaja onreadystatechange obavezno je potrebno proveriti uslov req.readyState == 4, koji ukazuje da su podaci učitaní. Dodatno se može proveriti i req.status == 200. Vidi tabele ispod.

Kod korišćenja objekta XMLHttpRequest sa POST metodom, potrebno je dodatno poslati header:

1req.open("POST", url, true);
2req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
3req.onreadystatechange = function() {
4if (req.readyState == 4)  { обработка результатов }       
5};     
6req.send('param1=1¶m2=0'); //теперь параметры передаются здесь

Više parametara razdvaja se znakom ampersand.

Potpuni primer:

01var req;
02
03if (window.XMLHttpRequest) req = new XMLHttpRequest();
04else if (window.ActiveXObject) {
05try {
06req = new ActiveXObject('Msxml2.XMLHTTP');
07} catch (e){}
08try {
09req = new ActiveXObject('Microsoft.XMLHTTP');
10} catch (e){}
11}
12
13if (req) {
14req.onreadystatechange = function() {
15if (req.readyState == 4 && req.status == 200)  { alert(req.responseText); }       
16}; 
17req.open("POST", 'xmlhttp.php', true);
18req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
19req.send('param=1&ajax=1');
20}
21else alert("Браузер не поддерживает AJAX");

Deo na serveru (URL u req.open) može biti napisan u bilo kom jeziku, sve dok podržava GET/POST zahteve. Vraćena vrednost (req.responseText) se generiše standardnim izlazom. Primer server-side dela u PHP-u:

1if(isset($_POST['param']))
2echo ($_SERVER['REMOTE_ADDR'])?"Your IP ".$_SERVER['REMOTE_ADDR']:"IP неизвестен";

članak ovde

Neke referentne informacije:

Metode klase XMLHttpRequest

Metoda Opis
abort() otkazuje trenutni zahtev
getAllResponseHeaders() vrati kompletan spisak HTTP zaglavlja u obliku niza
getResponseHeader(headerName) vrati vrednost navedenog zaglavlja
open(method, URL, async, userName, password) određuje metodu, URL i druge opcionale parametre zahteva; parametar async određuje da li se rad odvija u asinhronom režimu
send(content) šalje zahtev ka serveru
setRequestHeader(label, value) dodaje HTTP zaglavlje zahtevu
overrideMimeType(mimeType) omogućava da se navede mime-tip dokumenta, ako ga server nije preneo ili je preneo pogrešno. Pažnja: metoda ne postoji u Internet Explorer-u!

Svojstva klase XMLHttpRequest

Svojstvo Opis
onreadystatechange obradnik događaja koji se dešava pri svakoj promeni stanja objekta
readyState vrati trenutno stanje objekta (0 — nije inicijalizovan, 1 — otvoren, 2 — slanje podataka, 3 — primanje podataka i 4 — podaci su učitani)
responseText tekst odgovora na zahtev
responseXML tekst odgovora na zahtev u obliku XML-a, koji se zatim može parsirati pomoću DOM-a
status vrati HTTP status u obliku broja (404 — „Not Found“, 200 — „OK“ itd.)
statusText vrati status u obliku niza („Not Found“, „OK“ itd.)

Napomena: tekst može biti uz pomoć AI uz ljudsku proveru. Odgovoran: Dmytro Lomaka, Kaltenkirchen.