O ajax slyšela snad většina webových programátoru. Né všichni ale umí tuto technologii použít. V dnešním článku bych chtěl shrnout základy AJAXU a nakonec Vám vše ukázat v celku na kompletním příkladu. Nejprve bychom si měli pro jisto tu položit základní otázlu.
Ajax neboli Asynchronous JavaScript and XML je technologie postavená na javascriptu, která umožňuje zasílat HTTP požadavky bez nutnosti načíst stránku. Ke komunikaci kupřikladu s PHP scriptem může být využito jazyka XML.
Jako každá technologie má i ajax své výhody a nevýhody. Mezi hlavní nevýhody patří nepoužitelnost tlačítka Zpět, nebo záložek. Ale i to se už dá vyřešit. Ale o tom zase někdy jindy. Pokud se chcete o výhodách, a nevýhodach dočíst více doporučuji článek AJAX – kde jsou hranice?.
Ale nechtel bych se pouštět do většího polemizování o použití či nepoužití této technologie, přece jen by to měl být technicky zaměřený článek.
Na zasílání požadavků přes HTTP protokol je v javascriptu objekt XMLHttpRequest. Ten nejdříve musíme vytvořit. Normálně by se to provedlo takto:
http_request = new XMLHttpRequest();
Ale už tady se setkáme s problémem různé implementace v prohlížečích, protože v IE se tento objekt vytváří jako activeX a navíc ještě dvou typů. Naštěstí pro nás, jde tato „chyba“ jednoduše ošetřit, někteří PHP programátoři zajisté budou vědět co znamená try, catch:
if (window.XMLHttpRequest) {
http_request = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (eror) {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}
}
Tímto máme vyřešené vytváření objektu. Před samotným požadavkem, musíme nastavit funkci, která jej zpracuje. Funkce se vkládá do proměnné onreadystatechange.
http_request.onreadystatechange = function() { nazevfunkce(http_request); };
Teď se budeme věnovat funkci open(), která nám vytváří spojení s požadovaným scriptem. Funkce má dva povinné, a tři nepovinné parametry. První parametr je typ požadavku (GET/POST), do druhého povinného parametru patří url, kterou chceme volat. Url může být relativní nebo absolutní, ale z důvodů bezpečnosti není možno volat url na jiné dómeně. Třetí nepovinný parametr je typu boolean, pomocí něj nastavujeme jak budou data poslána. Defaultně je nastavený na true což znamená, že režim přenosu bude asynchronní (prohlížeč nebude čekat na výsledky). Pokud jej však nastavíme na false, znamená to, že režim přenosu bude synchronní, a prohlížeč při požadavku počka na výsledky (zamrzne). Takže asi víte, že je lepší ponechat defaultně nastavenou hodnotu. Poslední dva parametry, jsou jmého a heslo při přistupu na zabezpečenou adresu. ale to asi nemá moc využití.
Druhou funkcí je send(). Tato funkce má jeden parametr, který se liší podle typu požadavku. Při požadavku GET dáváme proměnné přímo do url ve tvaru script.php?promnena=pokus&promena=pokus, proto do parametru send dáváme pouze null. U požadavku typu POST se proměnné nedávájí do URL, ale předávíji se funkci send() ve tvaru promnena=pokus&promena=pokus. U typu POST je dobré ještě před voláním send() nastavit správný Content-Type, provedeme to jednoduše:
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
Pořad nevite jak by to mělo vypadat? Tak Vám tady dávám ještě vzorové volání pro GET i pro POST.
http_request.onreadystatechange = function() { funkce(http_request); };
http_request.open('GET', 'script.php?promnena=pokus', true);
http_request.send(null);
http_request.onreadystatechange = function() { funkce(http_request); };
http_request.open('POST', 'script.php', true);
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
http_request.send('promnena=pokus');
Tak a tohle je vše k posílání požadavků na server. Teď si ještě ukážeme funkci ná zpracování a samotnou jednoduchou aplikaci. Nejprve příklad takovéto funkce:
function zpracuj(http_request) {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
txtResponse = http_request.responseText;
xmlResponce = http_request.responseXML;
} else {
chyba();
}
}
}
Funkci předáváme jako parametr, objekt http_request. Při zavolání teto funkce se nejdříve otestuje stav požadavku, který je v proměnné readyState. Vrátit muže hodnotu od 0 do 4.
My potřebujeme postoupit dále když je požadavek hotov, takže testujeme pouze na hodnotu 4. Další proměnou, kterou musíme otestovat je status, ta vrací číslo chyby kterou obdrži od serveru. Třeba 404, když stránka neexistuje apod. My testujeme status 200, což znamená, že vše proběhlo v pořádku. Tímto požadavek skončil a my v proměnné responseText najdeme to co vrátil server. Pokud bychom potřebovali data procházet podle DOM, tak mužeme na serveru generovat XML a výsledky pak jsou v responseXML.
Ještě než přejdeme k praktické ukázce, chtěl bych Vás ještě upozornit na různé frameworky, ktere májí s ajaxem pomoct. Existují do většiny scriptovacích jazyků, a většina php MVC frameworku už nějaký ajaxový helper obsahuje. Pokud se chcete na Ajaxové frameworky více zaměřit doporučuji Vám stránku ajaxmatters.com. To byla taková vsuvka teď pokračujme k praktické ukázce.
Teď bych Vám chtěl ukázat jak jednoduše lze udělat Ajaxovou aplikaci. Bude se skládat ze dvou souborů. V prvním php souboru přijmeme proměnnou POST se slovem, ke kterému máme najít synonyma, najdeme je a vypíšeme je.
synonyma.php
<?php
function vratSynonyma($slovo, $cp)
{
$slovo = trim($slovo);
$cont = file_get_contents('http://jyxo.cz/s?q=' . urlencode(iconv($cp, 'UTF-8', $slovo)) . '&d=cz');
$cont = iconv('UTF-8', $cp, $cont);
$cont = strip_tags($cont, '<br>');
$reg = 'Synonyma'.$slovo.': (.+)(, \(vše\))?<br><br>';
preg_match_all("!$reg!", $cont, $arrSyn);
$arrSynonyma = explode(',', $arrSyn[1][0]);
$arrSynonyma = array_map('trim', $arrSynonyma);
if($arrSynonyma[count($arrSynonyma)-1]=="(vše)"){
unset($arrSynonyma[count($arrSynonyma)-1]);
}
return $arrSynonyma;
}
$arr = vratSynonyma($_POST['string'], 'UTF-8');
if(!isset($arr[0]) or $arr[0]==""){
echo "Nelze najit synonyma ke zvolenému slovu!";
exit;
}
foreach($arr as $sl){
echo $sl."\n";
}
?>
Druhým souborem je index.html, ve kterém do input pole vepíšeme slovo a po potvrzení dostaneme zpět jeho synonyma. Pokud jste pochopili to co jsem psal výše nebudete mít žádný problém kód pochopit. Kdybyjste přece jenom nevěděli, tak se zeptejte v komentářích.
index.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title>Synonyma pøes AJAX</title>
<script type="text/javascript">
function synonyma() {
var http_request = false;
var string = document.getElementById('string').value;
var request = "string="+string;
if (window.XMLHttpRequest) {
http_request = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (eror) {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}
}
http_request.onreadystatechange = function() { zpracuj(http_request); };
http_request.open('POST', 'synonyma.php', true);
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
http_request.send(request);
}
function zpracuj(http_request) {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
alert(http_request.responseText);
} else {
alert('Chyba');
}
}
}
</script>
</head>
<body>
<h2>Synonyma pøes AJAX</h2>
<input type="text" name="string" id="string" class="string">
<input type="submit" name="submit" value="submit" onclick="synonyma();">
</body>
</html>
Celý script si můžete vyzkoušet zde. Na stažení ho najdete v sekci download.
Nakonec trošku od tématu. Na můj blog začali v posledních dnech utočit spameři, proto zítra budu nasazovat nový antispam a trošku upravím blog, takže může nastat výpadek. Abych nezapoměl, pořád se můžete hlásit o odkaz v bočním menu. Ale abychom to nepletli do komentářu k ajaxu, tak mi je posílejte přes vzkaz
Líbí se ti text? Ano / Ne Dej mi o tom vědět! Nebo si jej můžeš zalinkovat! linkuj.cz / del.icio.us. Pokud chceš ještě něco víc, můžeš si text vytisknout, exportovat do PDF nebo na tento text upozornit e-mailem. Dále si ještě můžeš stáhnou RSS jeho komentářů, popřípadě ho i komentovat.
Konečně se někdo odhodlal napsat o Ajaxu větší článek s praktickou ukázkou. Na tenhle se bude velmi dobře odkazovat, když někdo bude chtít něco v Ajaxu pro začátky.
Tohle je snad nejlepší český článek o AJAXU, který jsem četl
Díky, bude se určitě hodit.
Tohle se mi bude opravdu hodit, dlouho jsem hledal nějaký návod pro začátečníky, ale nenašel jsem žádný, z kterého bych to pochopil ![]()
No pekny navod, ale porad v nem neco podstatneho postradam. AJAX je vyborna vec, uplne poprve jsem se o ni dozvedel pri pouzivani serveru www.meebo.com (typicka ukazka sloziteho AJAXU) a o nem jsem si precetl na Medhiho blogu, kde jeho clanek AJAX – navod pro zacatecniky muzu jen doporucit, tim samozrejme nechci pochybovat o kvalite tohodle, me se libil, ale na uplny zaver bych mel pripominku k tomu scriptu, otevrel jsem live ukazku a chtel ji vyzkouset. Zadal jsem slovo a kliknul na tlacitko, chvilku jsem cekal a pak mi vyskocilo ALERT okno bez textu, takze nevim ![]()
To me nastavlo, napsal jsem tak vycerpavajici komentar a on se nevlozil
![]()
No ono pokud není ke zvolenemu slovu mozne najit synonyma tak vyskoci prazdne ja to zapomnel osetrit, ale to je jen otazka veci v php, to s ajaxem nema nic spolecneho.
A jinak napis co podstatneho v tohle navodu postradas, at to muzu doplnit :D.
Spis mi porad, jaky slovo to ten tvuj Synonymum maker vubec najde ![]()
[11] Jiří Petřek : Zkousel jsem psa, kocku, hrusku, jabko, a az na park jsem se dockal odpovedi sad ![]()
Tak k psovi moc synonym asi moc neexistuje. Teda ja žádný neznám. ![]()
Zkouším nový komentářový antispam, Pokud Vám nejdou posílat komentáře, použijte CTRL+F5.
Pěkný článek. OT ten kód urchinu tady hází chybu, protože je vynecháno len+6 viz:
_uOsr[len+5]="tiscali.cz"; _uOkw[len+5]="query";
_uOsr[len+7]="volny.cz"; _uOkw[len+7]="search";
Pekne, pekne. Konecne sa aj v nasich (ceskoslovenskych) vodach zacina hovorit o ajaxe. Len tak dalej. ![]()
Jsem rád, že se líbí. A pravě z toho důvodu jsem ho psal, protože o AJAXU moc článku v češtině není. ![]()
Tak tady je opravdu pikantni priklad pouziti AJAXu v praxi – http://slab.seznam.cz/albert/
[21] QuickShare : Ted jsem na to koukal, mne se to celkem zamlouvá :D.
me se to seznamacke vubec nelibi, uz ten jax zacina prolizat do sfery kde nema co delat. Ajax se ma pouzit pro konfort a jako hlavni kamen na kterem stoji funkcnost webu. Bez JS si tam ani neskrtnu. Sice hodne uzivatelu ma js zapnute, ale to nemeni fakt ze kazdy prohlizec, ba dokonce kazda verze prohlizece ma upraveny intepret JS.
[23] error414 : Na jasne z hlediska pristupnosti, použitelnosti a postě toho jak má vypadat web je to takove jiné, a většině lidí by to asi vadilo, taky už se v podobném smyslu vyjádřilo spoustu lidi v diskusi k tomu vyhledávání, ale jako taková hříčka a zpestření je to super, Oni to nechtějí aní dát do ostrého vyhledávání, ale někde bokem by to nechat mohli. A myslím si že z hlediská programátorského provedení to maji super, už jen to že mají vyřešené záložkování a tlačítko zpět je good. Mnozí by si z tohodle mohli brát příklad.
[23] error414 : Nesouhlasim, myslim, ze v dnesni dobe je java script moderni technologie a vyuziva se hojne, nevidim duvod, proc bych nemohla slouzit pri vyhledavani jako AJAX, jen me by to usnadnilo praci, protoze s mym netem je snazsi prejit na jinou zalozku, nez cekat az se cela stranka nacte znovu. Navic je pravda, ze kdyz nekdo nema aktivovany js, nedostane se ani do internetoveho bankovnictvi.
To je v poradku z mame rozdilne nazory. Ano i ja mam JS rad jen me vadi rozdilna implementace. Zvlaste opera ma silene spatnou implementaci JS.
BTW: u Ajaxu je videt ze moderni neznamena nova
[26] error414 : Ano to je pravda implementace Javascriptu v různých prohlížečích je odlišná a v Opeře přímo katastrofální. (Jen tak mimochodem, nevim kolik lidí chodí na seznam s operou
.) Ale Ajax už zvladá většina, včetně opery. Další provedení (zpracování výsledků) už závisí na umu programátora, ale už nijak nesouvisí s Ajaxem.
[13] Jiří Petřek : Synonymum k „pes“ je přeci „nejlepší přítel člověka“. Ten slovník by se měl honem doplnit ![]()
Fred napsal/a: .cz"; _uOkw[len+5]=„query“; _uOsr[len+7]=„volny.cz“
thezaurus napsal/a: pes“ je přeci „nejlepší přítel člověka“. Ten slovník by se
![]()