7.07. Ajax hívások

Ajax (Asynchronous JavaScript and XML) - aszinkron javascript és XML kommunikáció

Az AJAX a webes kliens böngésző és a webszerver közötti kommunikáció. A kommunikáció menete:

  • A böngészőn futó webalkalmazás egy URL-en keresztül meghív a szerveren egy erőforrást - paraméterek átadásával - , GET vagy POST metódussal.

  • A szerver oldalon a hívás hatására lefut valamilyen szerveroldali alkalmazás, amely a kimenetén visszaküldi a választ. A válasz általában néhány tucat byte, struktúrálatlanul (szerkezet néélküli string) vagy struktúrában (XML, JSON, stb... szerkezetű string)

  • A böngészőn futó webalkalmazás visszakapja a szervertől visszaküldött adatokat, az adatokat feldolgozza és beilleszti a weboldal megfelelő helyére (DOM-ba)

Aszinkron működés: Ez azt jelenti, hogy az AJAX hívás indításakor a böngészőben futó folyamatok tovább haladnak és az AJAX hívás eredményének a feldolgozása akkor kezdődik, amikor vagy a válasz érkezik vissza a szervertől vagy a a hibakód. A hibakód lehet 404-es hiba (Nem létezik az URL), 50x hiba (Szerver oldali hiba)

Az AJAX története röviden: Már a 90-es években felmerült annak az igénye, hogy weboldalak kérjenek le adatokat szervertől és annak alapján működjenek tovább. ezt eredetileg a Microsoft JAVA appletek segítségével oldotta meg. Az Internet Explorer 5.0-val építettek a böngészőbe egy XMLHttpRequest nevű objektumot, amely már önmaga volt képes ezt megvalósítani. Az AJAX kifejezés 2005-ben jelent meg először széles körben.

Az IE 6.0 után a firefox és később a többi elterjedt böngésző is elkészítette a maga változatát és a javascript szabványos részévé tették az AJAX lehetőséget.

A jQuery az AJAX hívásokat szabványosítja és olyan megfelelő adatstruktúrát kínál, ami alapján viszonylag könnyen lehet a szükséges kódot megírni.

$.ajax(paraméterobjektum); - ezt az utasítást kell használni a szerver felé. Egyszerűnek látszik, de azért paraméterezni kell:

$.ajax({
    url: A meghívandó url,
    method: "POST",            // vagy "GET" - ha get, akkor nem lehet tetszőleges méretű adatokat átküldeni
    data: { nev1:"adat1", nev2: "adat2", ...},
    dataType: "html",          // Lehet még "json", "script", vagy nem adunk meg típust...
}).done(function( data ){      // Ez fut le, ha hiba nélkül visszajön az adat
                               // ... itt fut le az a kód, amely feldolgozza a szervertől visszakapott adatokat...
})
.fail( function( ){            //Itt fut le az a kód, amely hiba esetén üzen a felhasználónak
   
});

Az alábbi példákban a HTML, a javascript és a szerver oldali PHP kód majdnem ugyanaz.

1. Példa

Ebben a példában egy weboldalon rákattint a felhasználó egy <div>-re és ennek hatására egy másik adatrészbe betöltődik néhány adat. A böngésző egy ID-t küld át GET-tel. A szerver oldal a GET alapján nevet, lakcímet küld vissza ";"-vel elválasztott stringként. A visszakapott stringet a böngésző szétdarabolja és beteszi az elemeket e WEBoldal mezőibe.

HTML kód (pelda1.html )

<!doctype html>
<html lang="hu">
 <head>
  <meta charset="UTF-8">
  <title>Ajax 1. példa</title>
 </head>
 <style>
	.gomb{
	  border: ridge 3px grey;
	  background-color: grey;
	  text-align: center;
	  color: white;
	  width: 100px;
	}
	.kotelezo{
	   color: red;
	}
	#msg{
    	display: none;
		color: red;
	}
	.adat{
		display: none;
		border:1px solid blue;
	}
 </style>
 <script src="jquery-3.6.0.min.js"></script>
 <body>
  Kérek egy sorszámot: <input id="no" value="" title="sorszámot kérek"><span class="kotelezo">*</span>
  <br/>
  <span id="msg" class="kotelezo"></span>
  <div id="katt" class="gomb">Kattints ide</div>
  <table>
  <tr>
  <td id="nev" class="adat"></td>
  <td id="lakcim" class="adat"></td>
  </tr>
  </table>
   <!-- itt hívom meg a javascript kódot -->
  <script src="pelda1.js"></script>
 </body>
</html>

A javascript kód (pelda1.js)

$(document).ready(function(){

    //Eseménykezelő: ha a beviteli mezőre kattintunk, akkor álljon vissza a felület
    $("#no").click(function(){
        var m =$("#msg");
        m.hide(1000);
        $(".adat").hide(1000);
    });

    //A küldés eseménykezelője
    $("#katt").click(function(){
        var id = $("#no").val();	
        var m  = $("#msg");
        //ellenőrzöm, hogy a bevitt adat megfelel-e a feltételeknek: validálás
        if( (id.length < 1 || !$.isNumeric(id) || parseInt(id) < 1) ){
            m.html("0-nál nagyobb egész számot kell beírni!");
            m.show(1000);			
        }else{
            m.html("ok");
            m.css("color","green");

           // AJAX hívás
            $.ajax({
                url: "pelda1.php?id="+id,
                method: "GET",
            }).done(function(data){

               //Egyszerű stringet kapok vissza eredményül
                var a = data.split(",");
                $("#nev").html( a[0] );
                $("#lakcim").html( a[1] );
                $(".adat").show(1000);
            }).fail(function(){
                m.text("szerver oldali hiba!");
                m.show(1000);
            });	
           // AJAX vége
        } // if-else vége
    }); // Eseménykezelő vége

    //Kurzor legyen mutató, amikor a gomb fölé viszem
    $("#katt").hover(function(){
        $(this).css("cursor", "pointer");
    }, function(){
        $(this).css("pointer", "initial");
    });
});

PHP kód (file: pelda1.php)

<?php
$a = array(
   1=> array("nev"=> "Kiss Pista", "lakhely"=>"Budapest"),
   2=> array("nev"=> "Nagy Piri", "lakhely" =>"Piripócstarcsa"),
   3=> array("nev"=> "Kis Edina", "lakhely"=>"Bélapátfalva"),
   4=> array("nev"=> "Nagy Alexandru", "lakhely"=>"Nyusziváros"),
   5=> array("nev"=> "Kovács Géza", "lakhely"=>"Kajla város"),
   6=> array("nev"=> "Jani bá", "lakhely"=>"Ilyenolyan puszta"),
   7=> array("nev"=> "Fábián Ági", "lakhely"=>"Budapest"),
   8=> array("nev"=> "fábián Dániel", "lakhely"=>"Zürich"),
);
$id = isset($_GET['id']) && !empty($_GET["id"]) ? $_GET["id"] :-1;

if($id >-1 && $id< count($a)){
	$j = $a[ $id ];
}else{
	$j = array("nev" => "Nem létező", "lakhely" => "Ismeretlen");
}
// Stringet ad vissza eredményül. Az egyes részeket "," -vel fűzi össze
$back = $j["nev"] . "," . $j["lakhely"];
echo $back;
?>

2. Példa

A második példában egy weboldalon rákattint a felhasználó egy <div>-re és ennek hatására egy másik adatrészbe betöltődik néhány adat. A böngésző egy ID-t küld át GET   metódussal. A szerver oldalon a GET alapján kikeresi a megfelelő nevet és címet, json-t alakít belőle és az így létrejött stringet küldi vissza. 

A visszakapott JSON adatokat a böngésző visszaalakítja objektummá és beteszi a weboldalon a megfelelő helyre.

HTML kód ( pelda2.html )

<!doctype html>
<html lang="hu">
 <head>
  <meta charset="UTF-8">
  <title>Ajax 1. példa</title>
 </head>
 <style>
    .gomb{
        border: ridge 3px grey;
        background-color: grey;
        text-align: center;
        color: white;
        width: 100px;
    }
    .kotelezo{
        color: red;
    }
    #msg{
        display: none;
        color: red;
    }
    .adat{
        display: none;
        border:1px solid blue;
    }
 </style>
 <script src="jquery-3.6.0.min.js"></script>
 <body>
  Kérek egy sorszámot: <input id="no" value="" title="sorszámot kérek"><span class="kotelezo">*</span>
  <br/>
  <span id="msg" class="kotelezo"></span>
  <div id="katt" class="gomb">Kattints ide</div>
  <table>
  <tr>
  <td id="nev" class="adat"></td>
  <td id="lakcim" class="adat"></td>
  </tr>
  </table>
<!-- itt hívom meg a javascript kódot -->
  <script src="pelda2.js"></script>
 </body>
</html>

Javascript kód (pelda2.js)

$(document).ready(function(){
    //eseménykezelők
    $("#no").click(function(){
        var m =$("#msg");
        m.hide(1000);
        $(".adat").hide(1000);
    });

    //a küldés eseménykezelője
    $("#katt").click(function(){
        var id = $("#no").val();	
        var m  = $("#msg");
        if( (id.length < 1 || !$.isNumeric(id) || parseInt(id) < 1) ){
            m.html("0-nál nagyobb egész számot kell beírni!");
            m.show(1000);			
        }else{
            m.html("ok");
            m.css("color","green");

           // AJAX hívás
            $.ajax({
                url: "pelda2.php?id="+id,
                method: "GET",
            }).done(function(data){

                //JSON adatokat kap vissza
                $("#nev").html( data.nev );
                $("#lakcim").html( data.lakhely);
                $(".adat").show(1000);
            }).fail(function(){
                m.text("szerver oldali hiba!");
                m.show(1000);
            });	
           //AJAX vége
        }
    });

    //Kurzor legyen mutató, amikor a gomb fölé viszem
    $("#katt").hover(function(){
        $(this).css("cursor", "pointer");
    }, function(){
        $(this).css("pointer", "initial");
    });
});

A szerver oldali PHP kód (pelda2.php )

<?php
$a = array(
   1=> array("nev"=> "Kiss Pista", "lakhely"=>"Budapest"),
   2=> array("nev"=> "Nagy Piri", "lakhely" =>"Piripócstarcsa"),
   3=> array("nev"=> "Kis Edina", "lakhely"=>"Bélapátfalva"),
   4=> array("nev"=> "Nagy Alexandru", "lakhely"=>"Nyusziváros"),
   5=> array("nev"=> "Kovács Géza", "lakhely"=>"Kajla város"),
   6=> array("nev"=> "Jani bá", "lakhely"=>"Ilyenolyan puszta"),
   7=> array("nev"=> "Fábián Ági", "lakhely"=>"Budapest"),
   8=> array("nev"=> "fábián Dániel", "lakhely"=>"Zürich"),
);
$id = isset($_GET['id']) && !empty($_GET["id"]) ? $_GET["id"] :-1;

if($id >-1 && $id< count($a)){
    $j = $a[ $id ];
}else{
    $j = array("nev" => "Nem létező", "lakhely" => "Ismeretlen");
}

//JSON stringet készítünk az adatokból
$back = json_encode($j) ;
echo $back;
?>

A fenti példák fájljait innen lehet letölteni: ajax1.zip

Megjegyzések

  • A fenti példák éles környezetben nem lennének elég jók, mert a böngészőből átküldött adatokat ugyan leellenőrzöm a szerver oldalon, de nem biztos, hogy mindenre gondoltam.
  • Ha POST metódust akarunk használni, akkor a javascript AJAX hívásánál "GET" helset "POST"-ot és a PHP kódban a $_GET helyett $_POST-ot kell használni.
  • A szerver oldalon legyártottam egy két dimenziós tömböt és abban tárolom az adatokat. Ha egy adatbázisból kellene dolgozni, akkor a szerver a kapott ID-vel lekérdezést hajt végre az SQL szerverre és a visszakapott rekord-ot teszi be a json_encode() függvénybe. Ha nincsen visszaadott rekord, akkor pedig a megfelelő hibaüzenetet kell legyártani.