Jur4 Blog - Jiří Petřek alias Jur4 - webdesign, seo, programovaní, php, css, html

AJAX - teoreticky i prakticky

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.

Co to AJAX je?

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.

GET

http_request.onreadystatechange = function() { funkce(http_request); };
http_request.open('GET', 'script.php?promnena=pokus', true);
http_request.send(null);

POST

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.

  • 0 – Neinicializováno
  • 1 – Načítam
  • 2 – Načteno
  • 3 – Zpracovávám
  • 4 – Hotovo

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.

Ajaxové frameworky

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.

Synonyma přes AJAX

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.

Jiří Petřek | 10.9.2006 Ne 07:00 | Javascript | 29 komentářů

Komentáře k textu

Marty napsal:

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.

10.9.2006 Ne 15:33
[1]
Acci napsal:

Tohle je snad nejlepší český článek o AJAXU, který jsem četl :-) Díky, bude se určitě hodit.

10.9.2006 Ne 15:52
[2]
Pampuch napsal:

Gratuluji, poměrně dobrý článek o ajaxu :)

10.9.2006 Ne 15:59
[3]
Gouma napsal:

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 :-)

10.9.2006 Ne 18:45
[4]
QuickShare napsal:

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 :-|

10.9.2006 Ne 21:26
[5]
QuickShare napsal:

To me nastavlo, napsal jsem tak vycerpavajici komentar a on se nevlozil :-( :-(

10.9.2006 Ne 21:27
[6]
QuickShare napsal:

Aha, tak vlozil, jsem si rikal :-D

10.9.2006 Ne 21:27
[7]
Jiří Petřek napsal:

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.

10.9.2006 Ne 21:28
[8]
Jiří Petřek napsal:

Už je to ošetřené!

10.9.2006 Ne 21:31
[9]
QuickShare napsal:

Spis mi porad, jaky slovo to ten tvuj Synonymum maker vubec najde :-P

10.9.2006 Ne 23:46
Jiří Petřek napsal:

Jo tak to fakt nevím :-D.

10.9.2006 Ne 23:48
QuickShare napsal:

[11] Jiří Petřek : Zkousel jsem psa, kocku, hrusku, jabko, a az na park jsem se dockal odpovedi sad :-P

11.9.2006 Po 00:44
Jiří Petřek napsal:

Tak k psovi moc synonym asi moc neexistuje. Teda ja žádný neznám. 8-)

11.9.2006 Po 00:56
QuickShare napsal:

[13] Jiří Petřek : No tak neco jsem zkusit musel :-P

11.9.2006 Po 01:37
Jiří Petřek napsal:

Zkouším nový komentářový antispam, Pokud Vám nejdou posílat komentáře, použijte CTRL+F5.

11.9.2006 Po 01:57
Fred napsal:

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";
11.9.2006 Po 02:06
Jiří Petřek napsal:

[16] Fred : Tak toho jsem si nevšiml, díky za upozornění.

11.9.2006 Po 02:10
wow napsal:

super clanok :-)

11.9.2006 Po 04:05
Meldo napsal:

Pekne, pekne. Konecne sa aj v nasich (ceskoslovenskych) vodach zacina hovorit o ajaxe. Len tak dalej. 8-O

11.9.2006 Po 08:03
Jiří Petřek napsal:

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í. :-)

11.9.2006 Po 22:31
QuickShare napsal:

Tak tady je opravdu pikantni priklad pouziti AJAXu v praxi – http://slab.seznam.cz/albert/

18.9.2006 Po 23:34
Jiří Petřek napsal:

[21] QuickShare : Ted jsem na to koukal, mne se to celkem zamlouvá :D.

18.9.2006 Po 23:41
error414 napsal:

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.

19.9.2006 Út 16:33
Jiří Petřek napsal:

[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.

19.9.2006 Út 19:07
QuickShare napsal:

[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.

19.9.2006 Út 19:30
error414 napsal:

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

19.9.2006 Út 19:36
Jiří Petřek napsal:

[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 :-D.) 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.

19.9.2006 Út 19:53
thezaurus napsal:

[13] Jiří Petřek : Synonymum k „pes“ je přeci „nejlepší přítel člověka“. Ten slovník by se měl honem doplnit :-D

4.11.2006 So 00:10
sorac napsal:

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
:-( :-( :-(

7.11.2006 Út 14:15
Na texty napsané před více jak 60 dny nelze dále reagovat.

Úvod | Archív | Vzkaz | Download | Hledání | Odkazy | Fotoblog | Portfolio
Běží na RS2 RC4 s formátovačem Texy! | Hosting station.cz
© Jiří Petřek | Pagerank | Prohlášení o přístupnosti | Statistika | ^ Nahoru