AJAX - svi pričaju a niko da napiše kako :)

XMLHttpRequest ? AJAX ? Stara tehnologija - novo ime :) Hoćete da probate? Bar dvadesetak ljudi me pitalo da napišem primer nekog koda. Evo jednog prostog primera: http://www.devprotalk.com/showthread.php?t=53

Napredniji primer možete pogledati ovde:

Prvo definišemo jednu varijablu, čisto da stvari budu jasnije
var LOAD_COMPLETE = 4;

Kreiramo http objekat u zavisnosti od browsera. Internet Explorer ima mogućnost da čita “conditional compile”, odnosno da se izvrši deo koda na osnovu definisanih uslova (prostije: microsoft-ov jscript). Za one koji se nikadan isu bavili naprednijim programiranjem verovatno je zbunjujuće ono “try - catch”, to su u stvari exceptions, jednostavno izvršava se ono što stavite pod “try” a ako dođe do neke greške, izvrši se kod iza “catch”. Može ovo i drugačije da se napiše, ali je ovako “programerskije” :)


function getHTTPObject()
{
	var xmlhttp;
/*@cc_on
	@if (@_jscript_version >= 5)
		try {
			xmlhttp = new ActiveXObject(\"Msxml2.XMLHTTP\");
		}
		catch (e)
		{
			try
			{
				xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");
			}
			catch (E)
			{
				xmlhttp = false;
			}
		}
	@else
		xmlhttp = false;
@end @*/
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
	{
		try {
			xmlhttp = new XMLHttpRequest();
		} catch (e) { xmlhttp = false; }
	}
	return xmlhttp;
}

XMLHttpObject kreiramo sa:

var httpObj = getHTTPObject();

Zatim kreiramo funkciju koja ća da učitava neki url, i ako je uspešno učitano, onda se izvršava funkcija koja će učitani sadržaj da prikaže na određenom mestu (handleHttpObj), obično u nekom DIV-u:



function receiveDoc(url)
{
	if (url == '')
	{
		alert ('please enter url');
		return false;
	}
	if (httpObj.readyState == LOAD_COMPLETE || httpObj.readyState == 0)
	{
	  	httpObj.open('GET', url, true);
    	        httpObj.onreadystatechange = handleHttpObj;
	  	httpObj.send(null);
	}
}

Učitava se reply servera i sa njim radimo šta želimo, u ovom primeru ćemo dobijeni sadržaj jednostavno prikazati u nekom DIV-u koji nosi id “feed”. U ovom primeru takođe učitavamo i header (getAllResponseHeaders()) i možemo zbog debugg-ovanja i njega da prikažemo u nekom DIV-u (u ovom slučaju “hdr”).



function handleHttpObj()
{
	if (httpObj.readyState == LOAD_COMPLETE)
	{
		result = httpObj.responseText;
		header = httpObj.getAllResponseHeaders();
	
		if (httpObj.status == 404)
		{
			alert (\"Ih, bre. Nema tog dokumenta\");
		}
		else if (httpObj.status == 200)
		{
			ref = document.getElementById(\"feed\");
			ref.innerHTML = result;
			h = document.getElementById(\"hdr\");
			h.innerHTML = header;
		}
		else {
			alert ('Status '+httpObj.status+\" ne umem da prepoznam\");
		}
	}
}

Naravno ovo sve mora da se nađe između <script> i </script> jer je u pitanju JavaScript.

Kreiramo jednostavnu stranu:



<a href='#' onclick=''receiveDoc('test1.html'); return false;''>test1</a> -
<a href='#' onclick=''receiveDoc('test2.txt'); return false;''>test2</a> -
<a href='#' onclick=''receiveDoc('test.xml'); return false;''>xml</a> -
<a href='#' onclick=''receiveDoc('http://www.google.com/'); return false;''>google</a> -
<div id='hdr' style=''float:right: width:30%''></div>
<div id='feed' style=''width:65%;''></div>

Probajte, jednostavnije je nego što se čini na prvi pogled.

6 komentara na “AJAX - svi pričaju a niko da napiše kako :)”

  1. Mladen Jablanovic

    Je l’ to tvoj sajt guta operator “==” ili je u pitanju feature jScripta za koji jo nisam čuo, da je taj operator opcion?


  2. bluesman

    Ma muku sam namucio da ovo prikazem kao kod, ocigledno WordPress ima neku frku, odnosno ne znam kako da mu iskljucim “opcije” a da ne brljam po kodu. Recimo kada stavis minus ispred teksta onda stavi precrtan tekst -ovako- . Vidim, ocigledno guta “==”, ne znam sta drugo nego da okacim na download, ali mi nije bila to ideja vec da neko nesto nauci umesto da “prepise” :)

    Aj’ pokusacu da izmenim to, ne znam u cemu je problem.


  3. Mladen Jablanovic

    Da ti nije uključen [url=http://daringfireball.net/projects/markdown/syntax]markdown[/url] plugin?


  4. Mladen Jablanovic

    Ups. Izvinjavam se na pogreno unetom linku. I textile plugin izgleda slui za istu svrhu. Vazda se nađe neko da izmilja novi HTML. :(


  5. Dušan Boškić

    Nakon skoro godinu dana :)
    Da li je moguće zaobići pravilo Accessible URLs - http://ajaxpatterns.org/XMLHttpRequest_Call, jer nikako ne mogu da pošaljem request, a kamoli dobijem response sa nekog drugog servera. Npr. kao što je navedeno google


  6. Dušan Boškić

    Da odgovorim samom sebi :)
    http://serebryakov.ru/lab/ajaxextended/


Napišite komentar

Molba i napomena: Ako imate želju da komentarišete molim vas da se predstavite. Anonimne komentar brišem ili u najboljem slučaju totalno ignorišem. Uvrede na bilo čiji račun ne tolerišem, ako se ne slažete sa tekstom ili nekim komentarom slobodno i iskreno to napišite ali se suzdržite od uvreda bilo koje vrste.

XHTML: Možete koristiti HTML tagove: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Ako želite samo da SPAM-ujete, komentar će biti obrisan automatski, a ako vam je iz nekog razloga baš stalo da imate link ovde poslaću vam cenovnik za oglašavanje.