A dinamikus tartalmú oldalak egyre népszerűbbek, ám ezek mindegyike a szerveren rengeteg erőforrást használnak fel. Az oldalon található PHP leírások mindegyike segít abban, hogy egyszerűen készítsünk változó tartalmakat, ám lehetnek olyan esetek, hogy a szerveren nem érhető el a PHP.
A fentebb vázolt esetben jöhet jól egy lehetséges alternatíva: kliens-oldali adatfeldolgozás. A képlet nagyon egyszerű: ne terheljük azzal a szerver-gépet, hogy minden egyes kliensnek szóról-szóra megmondja, hogy mit is jelenítsen meg, hanem csak adja át az adatokat, a kliens meg kezdjen vele, amit akar…
(A legjobb példa, ami eszembe jut a különböző multi-player-es FPS-ek: a kiszolgáló csak az adatokat küldi ki [ XY játékos előrébb ment 1-el ] és a kliens feldolgozza azt. Ha bármelyik játékos megnyomja az előre gombot, akkor arról a szerver kap egy értesítést, amit szétküld az összes többi felhasználónak…)
Az adatokat egy bizonyos rendszerbe bele kell foglalnunk, különben azok nehezen értelmezhetőek lennének (különösen egy számítógép számára). Erre a rendszerezésre az Extended Markup Language (XML), egy egyre szélesebb körben használt eszköz a legmegfelelőbb. Az XML Dom (Document Object Model – Dokumentum objektum modell) részletezésére most nem térek ki, mert az igen hosszú lenne (több könyvet lehetne belőle írni), legyen elég annyi, hogy közel mindent egyszerűen tárolhatunk benne.
A modernebb böngészőkben (IE 5.5+, Mozilla) a beépített JavaScript értelmező már támogatja az XML fileok olvasását az ún. XMLDocument objektummal (IE alatt ez egy Active-X vezérlő). Természetesen a böngészők írói itt jól megkeverik a dolgokat: szabvány, mint olyan nincs…
Éppen ezért az objektum betöltésére egy kis JS kódot kell írnunk, ami a böngészőnek megfelelő objektumot tölt be:
<script type="text/javascript"> function loadXML(url) { var mozilla = (typeof document.implementation != 'undefined') && (typeof document.implementation.createDocument != 'undefined'); var ie = (typeof window.ActiveXObject != 'undefined'); if(mozilla) { this.xmlDoc = document.implementation.createDocument("", "", null); this.xmlDoc.strictErrorChecking = false; this.xmlDoc.async = false; this.fail = false; } else if(ie) { this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); this.xmlDoc.async = false; while(this.xmlDoc.readyState != 4) {}; this.fail = false; } else { this.xmlDoc = ''; this.fail = true; } if(this.fail != true) { try { this.xmlDoc.load(url) } catch(e) { this.fail = true; } } } </script> |
Ez az egyszerű funkció egy objektumot hoz létre, aminek két tulajdonsága van: az xmlDoc tulajdonság tartalmazza a létrehozott xmlDocument vezérlőt, a fail tulajdonság pedig egy igaz vagy hamis értéket attól függően, hogy sikeres volt-e a betöltés. Az objektum előkészítése után a paraméterben megadott url-ből megpróbáljuk betölteni a filet. Amennyiben hiba történt [nem létezik a file, az objektumunkkal valami baj volt, az XML fileunk-ban valami hiba van, stb.] a try… catch szerkezetettel „elkapjuk” a hibát, így a böngésző nem fog JavaScript hibát jelezni.
Ez így mind szép és jó, de mire lehet ezt használni? Még egy JS osztály megírásával (egy nagyon alap-szintű sablon-rendszer) pillanatok alatt létre lehet hozni egy XML alapú kliens-oldali hírrendszert. Ehhez először lássuk a sablon-rendszert [a sablon-rendszer felhasználja a fenti osztályunkat, tehát szükséges hozzá ennek megléte!]
<script type="text/javascript"> function xml_template(template_file) { xmlLoader = new loadXML(template_file + '.xml'); if(xmlLoader.fail == true) { this.original = 'Sikertelen sablon-betöltés'; } else { this.original = xmlLoader.xmlDoc.getElementsByTagName('templatedata')[0].firstChild.nodeValue; } this.current = this.original; this.addValue = addValue; this.show = show; this.reset = reset; } function addValue(key, value) { this.current = this.current.replace('{'+key.toUpperCase()+'}', value); } function show() { return this.current; } function reset() { this.current = this.original; return true; } </script> |
Mint látható ennek az osztálynak már 3 metódusa is van a két tulajdonság mellett. A két tulajdonság (original, current) a sablon két változata: az eredeti, amit a szerverről töltöttünk le, és egy, amin a változtatásokat folyamatosan eszközöljük. Amennyiben a letöltés sikertelen volt a „sablonunk” csak egy hibaüzenetet fog tartalmazni.
A metódusok sorrendben: új kulcs hozzáadása (kulcs, érték). A {kulcs_nagybetűvel} szövegek helyére beilleszti a második paraméterben megadott szöveget. (Példát később láthatunk erre)
A show() metódus visszaadja a sablon jelenlegi változatát, amiben az összes az utolsó reset() óta történt változtatás megtalálható. A reset() – mint nevéből kiderül – az eredeti sablon visszaállítására szolgál.
A következőkben két XML filera is szükségünk lesz még: a hírrendszer sablon-fájljára, és az adatokat tartalmazó fájlra.
(Mindkettőbe – természetesen – vihetőek fel új tagok.)
template_news.xml
<?xml version="1.0" encoding"ISO-8859-2"?> <template> <name>Hírrendszer-sablon</name> <templatedata> <div>{TITLE} - {DATE} ({AUTHOR}) <br /> {TEXT} </div> </templatedata> </template> |
Mint látható itt csak egy nagyon egyszerű sablon hoztam létre, semmi felesleges díszítés, de természetesen azt is bele lehetett volna vinni. Fontos azonban azt megjegyezni, hogy – mivel XML fájlról van szó – a < és > karaktereket nem használhatjuk helyettük az < és > karakterláncokat kell felhasználnunk! [A letölthető csomagban jobban látszik…]
A másik fileunk egy szabványos RSS file lesz: ilyet rengeteg helyen találhatunk a neten, úgyhogy a szerkezetére most nem térek ki. A lényeg a lényeg kell egy index.html [vagy akármilyen nevű html file], ami összefogja a fenti dolgokat:
<html> <head> <title>RSS olvasás JavaScripttel</title> </head> <script type="text/javascript" src="loadxml.js"></script> <script type="text/javascript" src="template.js"></script> <script type="text/javascript"> function loadNews(rssfile) { var xml = new loadXML(rssfile); if(xml.fail == true) { document.getElementById('content').innerHTML = 'Belsõ hiba!'; } else { var news = ''; var template = new xml_template('template_news'); x = xml.xmlDoc.getElementsByTagName('item'); if(x.length != 0) { for(var i = 0; i < x.length; i++) { template.addValue('title', x[i].getElementsByTagName('title')[0].firstChild.nodeValue); template.addValue('text', x[i].getElementsByTagName('description')[0].firstChild.nodeValue); template.addValue('date', x[i].getElementsByTagName('pubDate')[0].firstChild.nodeValue); template.addValue('author', x[i].getElementsByTagName('author')[0].firstChild.nodeValue); news = news + template.show(); template.reset(); } } document.getElementById('content').innerHTML = news; } return true; } </script> <body onload="loadNews('news.xml')"> <div id="content"> </div> </body> </html> |
Ezzel el is készült a gyors kis hírrendszerünk, ami gyakorlatilag statikus lapok kiszolgálásából áll, nem terheli – annyira – a szervert, és gyorsabban és egyszerűbben formázható, mint a „sima” html oldalak… Mint mindig, ez csak egy fajta felhasználása a végtelen számú lehetőségnek, amit ez a technika nyújthat… „Én csak az ajtót mutatom meg!”
A fenti kis program akár kliens-oldali RSS olvasásra is alkalmas lenne, ha csak az Internet Explorer létezne, de sajnos nem így van: a Mozilla nem hajlandó másik domain-ből megnyitni xml fileokat…
Az összes file letölthető innen.
a chrome-ban sajna belső hibával megáll. :( tud valaki segíteni?