„2007:Ajax függvények” változatai közötti eltérés

A Miau Wiki wikiből
(Ajax függvények)
(Kiterjesztések az Array osztályhoz)
974. sor: 974. sor:
 
formázott formában adja</font></p>
 
formázott formában adja</font></p>
 
<p class="western" style="widows: 2; orphans: 2;">vissza a tömb
 
<p class="western" style="widows: 2; orphans: 2;">vissza a tömb
elemeit.</p>/td>
+
elemeit.</p></td>
 
</tr>
 
</tr>
 
</table>
 
</table>

A lap 2007. december 18., 15:37-kori változata

Mi is az AJAX?

A leírás megtalálható az alábbi linken: Wikipedia.hu


Prototype.js

Mi is ez?

Abban az esetben ha még nem találkoztál volna vele, a prototype.js egy JavaScript könyvtár,melyet Sam Stephenson készített. Ez a szabványos, nagyon jól átgondolt és megírt könyvtár nagy terhet vesz le mindazok válláról, akik a Web 2.0-t jellemző interaktivitást szeretnének az,oldalaikon implementálni. Ha már próbáltad használni ezt a könyvtárat akkor feltünhetett, hogy a dokumentáció nem a legerősebb oldala. Mint sok más hozzám hasonló fejlesztő, próbáltam a forráskódot olvasgatni és kísérletezni vele. Gondoltam jó dologl enne jegyzetelni miközben megismerem és ezt megosztani másokkal is. Ezenkívül figyelmedbe ajánlok egy nem hivatalos referenciát a könyvtár által szolgáltatott objektumokról, osztályokról, függvényekről és kiterjesztésekről. Azok a fejlesztők akik járatosak a Ruby programozási nyelvben, a példák és a referencia tanulmányozása közben észreveszik majd a hasonlóságot a Ruby sok beépített osztályával és a könyvtár által implementált kiterjesztésekkel.

A segédfüggvények

A könyvtár rengeteg előre definiált objektumot és segédfüggvényt tartalmaz. Ezen függvények nyilvánvaló célja, hogy sok felesleges gépeléstől és munkától mentse meg a fejlesztőt.

A $() függvény használata

A $() függyvény egy könnyen használható rövidítése a gyakran használt document.getElementById() DOM függvénynek. Az eredetihez hasonlóan a paraméterben átadott azonosítóval rendelkező elemmel tér vissza. De tovább is megy egy kicsit, így több azonosítót is át lehet adni neki paraméterként és ebben az esetben egy objektum tömbbel fog visszatérni, ami tartalmazza az összes kért elemet. A következő példa ezt mutatja be.

  <HTML>
  <HEAD>
  <TITLE> Tesztoldal </TITLE>
  <script src="prototype-1.4.0.js"></script>
  <script>
  function test1()
  {
  var d = $('myDiv');
  alert(d.innerHTML);
  }
  function test2()
  {
  var divs = $('myDiv','myOtherDiv');
  for(i=0; i<divs.length; i++)
  {
  alert(divs[i].innerHTML);
  }
  }
  </script>
  </HEAD>
  <BODY>
  <input type="button" value=Test1 onclick="test1();">
<input type="button" value=Test2 onclick="test2();">
</BODY> </HTML>


Egy másik hasznos tulajdonsága ennek a függvénynek, hogy nem pusztán az azonosítót lehet neki átadni szövegként, hanem magát az elemet mint objektumot, ez pedig igen hasznos lehet azokban az esetekben amikor új függvényeket készítünk melyekben mindkét fajta paraméterezésre lehetőséget szeretnénk biztosítani.

Az $F() függvény használata

Az $F() függvény is egy hasznos rövidítés, bármilyen beviteli mező értékét képes visszaadni, akár egy lenyíló listáét is. A már az előzőekben leírtakhoz hasonlóan az azonosítót vagy magát az objektumot is át lehet adni paraméterként.

  <script>
  function test3()
  {
  alert( $F('userName') );
  }
  </script>
  <input type="text" id="userName" value="Joe Doe">
<input type="button" value=Test3 onclick="test3();">


Az $A() függvény használata

Az $A() függvény a kapott paramétert tömbbé konvertálja. Ez a függvény az Array osztály kiterjesztéseivel együtt használva sokkal egyszerűbbé teszi olyan függvények írását, melyekben változó számú paramétereket akarunk fogadni.

  <script>
  function shoutOut(){
  sayHi('Hello, ', 'Homer', 'Bart', 'Marge', 'Snowball');
  }
  function sayHi(){
  var names = $A(arguments).slice(1);
  var phrase = arguments[0];
  for(i=0; i<names.length; i++)
  alert(phrase + names[i]);
  }
  </script>
  <input type="button" value="Say hi to everybody" onclick="shoutOut();" >

A $H() függvény használata

A $H() függvény bármilyen asszociatív tömböt egy Hash objektummá konvertál.

  <script>
  function testHash()
  {
  var a = [];
  //az asszociatív tömb feltöltése
  a['first'] = 10;
  a['second'] = 20;
  a['third'] = 30;
  //konvertájuk
  var h = $H(a);
  alert(h.toQueryString()); //displays:
  first=10&second=20&third=30
  }
  </script>

Az $R() függvény használata

Az $R() függvény pusztán csak egy rövidítése a new ObjectRange(lowerBound, upperBound, excludeBounds)-nek. Az ObjectRange osztály dokumentációjában megtalálhatod a bővebb leírást. De azért nézzünk meg gyorsan egy egyszerű példát ami megmutatja, hogyan kell végigiterálni az each metódus segítségével. Erről a metódusról pedig az Enumerable osztály dokumentációjában olvashatsz bővebben.

  <script>
  function demoDollar_R(){
  var range = $R(10, 20, false);
  range.each(function(value, index){
  alert(value);
  });
  }
  </script>
  <input type="button" value="Sample Count" onclick="demoDollar_R();" >

A Try.these() függvény használata

A Try.these() függvény akkor lehet hasznos számodra, ha több függvényhívást szeretnél egymás után végrehajtatni, mindaddig amíg az egyik sikeres nem lesz. Értelemszerűen több függvényt lehet neki paraméterként átadni és ezeket sorra elkezdi meghívni mindaddig amíg az egyik nem működik, és a függvény visszatérési értéke ennek visszadott értéke lesz. A következő példában használt xmlNode.text függvény csak bizonyos böngészők esetében működik, a xmlNode.textContent függvény pedig más böngészőkkel vezet sikerre. A Try.these() használatával azzal kapjuk vissza a megfelelő eredményt amely működött.

  <script>
  function getXmlNodeValue(xmlNode){
  return Try.these(
  function() {return xmlNode.text;},
  function() {return xmlNode.textContent;)
  );
  }
  </script>

Az Ajax objektum

Az eddig leírt segédfüggvények szépek és jók, de valljuk be, nem igazán rengetik meg a világot. Talán ezeket magad is megcsináltad és ott vannak már a saját szkriptjeidben. De ezek a függvények csak a jéghegy csúcsát jelentik. Biztos vagyok benne, hogy a prototype.js AJAX lehetőségei keltik fel majd igazán az érdeklődésedet. Csapjunk is bele, nézzük meg miként teszi könnyebbé az életedet a könyvtár ha AJAX használtára van szükséged. Az Ajax objektum egy előre definiált objetum amit a könyvtár hoz létre azért, hogy elfedje és egyszerűsítse a trükközést ami az AJAX funkcionalitáshoz szükséges. Az objektum több osztályt is tartalmaz amely AJAX logikát tartalmaz. Nézzünk meg párat ezekből.

Az Ajax.Request osztály

Ha nem használsz semmiféle könyvtárat akkor elég sok kódot kell írnod ahhoz, hogy létrehozz egy XMLHttpRequest objektumot és nyomonkövesd a folyamatokat aszinkron, majd feldolgozd a választ. Na és szerencsésnek mondhatod magad, ha csak egyfajta böngészővel foglalkoznod. Ennek segítésére a könyvtárban definiálva van az Ajax.Request osztály. Vegyünk egy példát, mondjuk van egy alkalmazásod ami képes kommunikálni a szerverrel a "http://yoursever/app/get_sales?empID=1234&year=1998" hivatkozáson keresztül és a választ a következő XML formában küldi vissza.

  <?xml version="1.0" encoding="utf-8" ?>
  <ajax-response>
  <response type="object" id="productDetails">
  <monthly-sales>
  <employee-sales>
  <employee-id>1234</employee-id>
  <year-month>1998-01</year-month>
  <sales>$8,115.36</sales>
  </employee-sales>
  <employee-sales>
  <employee-id>1234</employee-id>
  <year-month>1998-02</year-month>
  <sales>$11,147.51</sales>
  </employee-sales>
  </monthly-sales>
  </response>
  </ajax-response>


Az Ajax.Request objektum segítségével nagyon egyszerű a szerverhez eljuttatni a kérést és a kapott választ feldolgozni. A következő példa ezt mutatja be.

  <script>
  function searchSales()
  {
  var empID = $F('lstEmployees');
  var y = $F('lstYears');
  var url = 'http://yoursever/app/get_sales';
  var pars = 'empID=' + empID + '&year=' + y;
  var myAjax = new Ajax.Request(
  url,
  {
  method: 'get',
  parameters: pars,
  onComplete: showResponse
  });
  }
  function showResponse(originalRequest)
  {
  //put returned XML in the textarea
  $('result').value = originalRequest.responseText;
  }
  </script>
  <select id="lstEmployees" size="10" onchange="searchSales()">
  <option value="5">Buchanan, Steven</option>
  <option value="8">Callahan, Laura</option>
  <option value="1">Davolio, Nancy</option>
  </select>
  <select id="lstYears" size="3" onchange="searchSales()">
  <option selected="selected" value="1996">1996</option>
  <option value="1997">1997</option>
  <option value="1998">1998</option>
  </select>
  
<textarea id=result cols=60 rows=10 ></textarea>

Az Ajax.Request objektumnak átadott paramétert. Ez {method: 'get', parameters: pars, onComplete: showResponse} egy névtelen objektumot reprezentál. Ez azt jelenti, hogy egy olyan objektumot adunk át amelynek a method tulajdonsága a 'get' szöveges értéket tartalmazza, a parameters tulajdonság a HTTP kérés paramétereit, az onComplete pedig a showResponse függvényre való hivatkozást tartalmazza. Ezeken kívül van még néhány olyan tulajdonság amit meg lehet adni, ilyen például az asynchronous, aminek az értéke true vagy false lehet és azt határozza meg, hogy az AJAX hívás a szerver felé aszinkron módon fog-e történni (az alapértelmezett érték a true). Összességében ez a paraméter határozza meg az AJAX hívás opcióit. A példánkban az első paraméterben átadott címet hívjuk meg HTTP GET paranccsal és a pars paraméterben megadott paraméterlistát kapja meg, majd az Ajax.Request objektum a showResponse függvényt fogja meghívni miután megérkezett a válasz a kérésünkre. Mint ahogy ismeretes, az XMLHttpRequest folyamatosan jelzi a HTTP kérés állapotát. Ez az állapot négy különböző esetet takar: Loading, Loaded, Interactive, vagy Complete. Megmondhatod az Ajax.Request objektumnak, hogy hívjon meg egy adott függvényt valamilyen állapot elérésekor, ezek közül a Complete a leggyakrabban használt. Ahhoz, hogy az objektum tudja milyen függvényt kell meghívnia az állapot elérésekor, egyszerűen az onXXXXX tulajdonságon keresztül lehet megadni számára, mint ahogy a fenti példában az onComplete szerepel. Ez a függvény egy paramétert fog megkapni, ami maga az XMLHttpRequest objektum lesz. Ezt az objektumot tudod arra használni, hogy kinyerd a visszakapott választ vagy éppen leellenőrizd a status tulajdonságot, ami a HTTP kérés válaszkódja. Van még két másik érdekes opció az eredmények feldolgozásához. Meg tudunk adni a onSuccess paraméterben egy függvényt amit sikeres AJAX hívás esetén fog meghívni, míg az onFailure tulajdonságon keresztül olyan függvényt, amit akkor hív meg, ha szerveroldali hiba történt. Az onXXXXX opciókhoz hasonlóan ezek is az XMLHttpRequest objektumot fogják megkapni egyetlen paraméterként. Az 1.4.0-s verzióban egy újfajta eseménykezelés került bevezetésre. Ha van olyan kódod amit mindig le kellene futtatni egy adott esemény kiváltódásakor, függetlenül attól, hogy melyik AJAX kérés váltotta azt ki, akkor az új Ajax.Responders objektumot tudod használni. Tegyük fel, hogy szeretnél valamiféle látványelemet használni arra, hogy a felhasználó felé jelezd azt, hogy az AJAX hívás folyamatban van. Ekkor két globális eseménykezelőt tudsz használni, az egyik megjeleníti az ikont az első hívás kezdetén, a másik pedig elrejtni amikor az utolsó válasz is megérkezett.

Na de lássuk a példát.

  <script>
  var myGlobalHandlers = {
  onCreate: function(){
  Element.show('systemWorking');
  },
  onComplete: function() {
  if(Ajax.activeRequestCount == 0){
  Element.hide('systemWorking');
  }
  }
  };
  Ajax.Responders.register(myGlobalHandlers);
  </script>
<img src='spinner.gif'>Loading...

Az eddigi példákban nem dolgoztuk fel a kapott XML választ, hanem csak egyszerűen beraktuk egy szövegdobozba. Valós környezetben először ki kell nyerni az értékes információt belőle majd néhány elemet az oldalon módosítani, vagy esetleg XSLT transzformáció segítségével HTML kimenetet produkálunk az oldal számára.

Erről bővebben az Ajax.Request és az options referenciákbál találhatsz.

Az Ajax.Updater osztály használata

Ha esetleg a szerver már HTML formában küldi a választ a kérésre, akkor a könyvtár Ajax.Updater osztályával könnyebbé teheti az életedet, hiszen ennek csak meg kell mondanod, hogy melyik elemet szeretnéd feltölteni az AJAX hívásra kapott HTML válasszal. De a példa beszédesebb, mint ahogy le tudnám írni.

  <script>
  function getHTML()
  {
  var url = 'http://yourserver/app/getSomeHTML';
  var pars = 'someParameter=ABC';
  var myAjax = new Ajax.Updater(
  'placeholder',
  url,
  {
  method: 'get',
  parameters: pars
  });
  }
  </script>
  <input type=button value=GetHtml onclick="getHTML()">

Észre lehet venni, hogy a kód nagyon hasonló az eddigi példákban találhatókhoz az onComplete függvény megadásának kivételével illetve a konstruktorban található elemazonosítóval. Na de változtassunk egy kicsit a kódon, hogy megnézzük miként is lehet a szerveroldali hibákat lekezelni. Ehhez meg kell adnunk egy, a már fentebb leírt opciót, ez pedig az onFailure. Ezenkívül azt is meghatározzuk, hogy a megadott placeholder csak abban az esetben kerüljön feltöltésre, ha a művelet sikeres volt. Ehhez az elsőnek átadott elemazonosító paraméter helyett egy objektumot kell átadni két tulajdonsággal: success (akkor hívódik meg ha minden sikeres volt) és failure (ez pedig akkor ha gond volt). De mi most nem fogjuk használni az failure tulajdonságot, hanem az onFailure tulajdonságban megadjuk a reportError függvényt.

  <script>
  function getHTML()
  {
  var url = 'http://yourserver/app/getSomeHTML';
  var pars = 'someParameter=ABC';
  var myAjax = new Ajax.Updater(
  {success: 'placeholder'},
  url,
  {
  method: 'get',
  parameters: pars,
  onFailure: reportError
  });
  }
  function reportError(request)
  {
  alert('Bocsi, ez nem jött össze.');
  }
  </script>
  <input type=button value=GetHtml onclick="getHTML()">

De akkor sem kell pánikba esni, ha a szerver HTML formátum helyett egy JavaScript kódot ad válaszként, mert az Ajax.Updater objektum ebben az esetben kiértékeli azt. Ahhoz, hogy az objektum a választ JavaScriptként kezelje, egyszerűen a tulajdonságok listájához hozzá kell adni az evalScripts: true; paramétert utolsóként az objektum konstruktorában.

Kiterjesztések a JavaScript osztályokhoz

Az egyik módja annak, hogy a prototype.js könyvtár új funkciókat biztosít számunkra az, hogy kiterjeszti a már meglévő JavaScript osztályokat.

Kiterjesztések az Object osztályhoz

Metódus

Típus

Paraméter

Leírás

extend(destination,

source)


Statikus


destination:

bármilyen

objektum, source:

bármilyen objektum


Az örököltetést valósítja meg oly módon,

hogy átmásolja a source összes

tulajdonságát és metódusát a destination

objektumba.


inspect(targetObj)

Statikus

targetObj:

bármilyen objektum


Szöveges, könnyen olvasható formában

reprezentálja a targetObj objektumot. Ez

adja meg az alapértelmezett visszatérési

értékét a toString függvénynek, ha az adott

objektumban nincs definiálva az inspect

példánymetódus.



Kiterjesztések az Number osztályhoz

Metódus

Típus

Paraméter

Leírás

ToColorpart()

Példány

Nincs

A számot hexadecimális formában adja

vissza. Ez hasznos amikor az RGB

komponenst a HTML reprezentációra akarjuk

konvertálni.

Succ()

Példány

Nincs

A következő számot adja vissza, ez olyan

esetben használható amikor iterátor van.


Times(iterator)

Példány

Iterator:egy Function(value,index) függvény objektum

Meghívja az iterator függvényt folyamatosan

átadva neki a value és index paramétereket,

ami az iterátor jelenlegi értékét és a aktuális

indexét tartalmazza.


Kiterjesztések a Function osztályhoz

Metódus

Típus

Paraméter

Leírás

Bind(object)

Példány

Object: az objektum amely tartalmazza a metódust

Visszadja egy példányát a

függvénynek a függvényt(=

metódust) tartalmazó objektumból.

A visszaadott függvénynek

ugyanazon argumentumai lesznek,

mint az eredetinek volt.


BindAsEventListener

Példány

Object: objektum ami

tartalmazza a metódust


Visszadja egy példányát a

függvénynek a függvényt(=

metódust) tartalmazó objektumból.

A visszaadott függvénynek az adott

event objektum lesz a paramétere.


Kiterjesztészek a String osztályhoz

Metódus

Típus

Paraméter

Leírás

stripTags()

példány

nincs

Visszaadja a szöveget HTML és XML tagok közül

stripScripts()

példány

nincs

Visszaadja a szöveget <script/> blokkok nélkül

escapeHTML()

példány

nincs

Visszaadja a szöveget a HTML karakterek eszképelése után

unescapeHTML()

példány

nincs

Az escapeHTML() fordítottja

extractScripts()

példány

nincs

Egy Array objektumot ad vissza, ami tartalmazza a

szövegben található összes <script /> blokkot.

evalScript()

példány

nincs

Kiértékeli a szövegben az összes<script/> blokkot

toQueryParams()

példány

nincs

A paraméterlistát szétválasztja egy asszociatív

tömbbe ami a paraméter neve által van indexelve.

ParseQuery()

példány

nincs

Ugyanaz, mint a toQueryParams().

toArray()

példány

nincs

A szöveg karaktereit szétválasztja egy tömbbe.

Camelize()

példány

nincs

Egy kötöjellel elválasztott szöveget camelCase

formára konvertál. Ez nagyon hasznos lehet, ha

olyan kódot írunk ami stílus tulajdonságokat

használ.


Kiterjesztések az Array osztályhoz

Metódus

Típus

Paraméter

Leírás

Clear()

példány

Nincs

Kiüríti a tömböt és visszaadja magát a

tömböt.


First()

példány

Nincs

Visszaadja a tömb első elemét

Last()

példány

Nincs

Visszaadja a tömp utolsó elemét

Compact()

példány

Nincs

Visszaadja a tömböt azon elemek

nélkül melyekben null vagy undefined

szerepel. Ez a metódus nem változtaja

meg magát a tömböt.

Flatten()

példány

Nincs

Egy dimenziós tömböt ad vissza úgy,

hogy rekurzívan végigmegy az

elemeken és azok amelyek tömböt

tartalmaznak, szintén belekerülnek a

visszaadott tömbbe.

without(value1 [, value2

[, .. valueN]])

példány

value1 ... valueN:

értékek amelyeket ki kell venni a

tömbből

Visszaadja a paraméterekben

megadott értékek nélküli tömbböt.

indexOf(value)

példány

value: az érték amit

keresünk.

Visszaadja a pozícióját annak az

elemnek ami tartalmazza a megadott

value értékét. Az eredmény -1 lesz ha

a value nem található.

Reverse([applyToSelf

példány

applyToSelf: azt

jelöli, hogy magát a tömböt is meg kell-e fordítani.

Megfordítja az elemek sorrendjét a

tömbben és azt adja vissza. Ha nincs

paraméter megadva vagy az értéke

true, akkor magát a tömbböt is

megfordítja. Egyéb esetben

változatlan marad.

Shift()

példány

Nincs

Visszaadja az első elemet és kiveszi a

tömbből, így annak mérete eggyel csökken

Inspect()

példány

nincs

Szövegesen formázott formában adja

vissza a tömb elemeit.