JavaScripttel lehetőségünk van a dokumentumot tartalmazó böngészőablak tulajdonságait is programozni. Ebben a fejezetben az ehhez tartozó ismereteket tekintjük át: milyen információk érhetőek el és módosíthatók, hogyan lehet új ablakot nyitni, stb.
A korábbi fejezetekben először megismerkedhettünk a JavaScript nyelvvel, megnéztük, miben hasonlít a C++ vagy Java nyelvre, és milyen nyelvi tulajdonságokban különbözik, milyen lehetőségeink vannak az adataink reprezentálására, és az adatok feldolgozásáért felelős programozási tételek hogyan implementálhatók. A pusztán nyelvi felfedezést követően azt vizsgáltuk meg, hogy milyen módon vagyunk képesek JavaScriptből a HTML dokumentumbeli elemeket használni feladataink megoldásához. Láthattuk, hogy ehhez pár alap koncepció megértése a szükséges. Az egyik ilyen a Dokumentum Objektum Modell, a DOM volt, amely a HTML elemeknek megfelelő JavaScript objektumok hierarchiája, egy olyan programozói interfész, amelyen keresztül a dokumentum tetszőlegesen módosítható. A másik lényeges tudnivaló az eseményekhez és azok kezeléséhez kapcsolódott. Láthattuk, hogy a felhasználóval való kommunikáció alapvetően az elemeken kiváltott eseményeken keresztül valósul meg.
Noha a kliensoldali dinamikus webprogramozás elsődlegesen a HTML dokumentumra irányul, a JavaScript által elérhető és programozható objektumoknak azonban van még egy tágabb köre, mégpedig maga a böngészőablak, amelynek egyik részeként jelenik meg a dokumentum, ahogy azt az alábbi ábra is mutatja.
Ebben a fejezetben azt vizsgáljuk meg, hogy JavaScriptből a böngészőablak mely tulajdonságait kérdezhetjük le és állíthatjuk be, és milyen érdekes vagy hasznos szolgáltatásokhoz juthatunk ezen keresztül.
Ahogy a HTML elemeknek a DOM objektumok szolgáltatják a programozási felületét, úgy a böngészőablakhoz kapcsolódó szolgáltatásokat is egy-egy objektumon keresztül érhetjük el. Ezek az objektumok ugyancsak hierarchiába vannak rendezve, és ezt a hierarchiát hívjuk a böngésző objektum modelljének, röviden BOM-nak.
A BOM hierarchia csúcsán a window objektum áll. Ez eredetileg minden böngészőablakhoz külön létrejött, a füles böngészés elterjedésével azonban fülenként jön létre egy-egy window objektum. A BOM hierarchia viszonylag lapos, a böngészőablak nyújtotta szolgáltatásoknak megfelelő interfész objektumok ugyanis közvetlenül a window alá vannak becsatolva, annak egy-egy tulajdonságaként, ahogy az az alábbi ábrán is látható. Az ábrán jól látszik, hogy a BOM hierarchia pontosan tükrözi az ablak és a dokumentum viszonyát: ahogy a dokumentum az ablak részeként jelenik meg, úgy a DOM gyökerét képező document a window részeként érhető el.
A BOM ugyan nem szabványos, de minden böngészőben hasonlóan implementálták. Eltérések vannak ugyan, de a főbb szolgáltatások megegyeznek.
https://developer.mozilla.org/en-US/docs/DOM/window||A Mozilla BOM referenciája
Programozási szempontból érdekes lehet, hogy a window objektum biztosítja a globális névteret. Ez azt jelenti, hogy minden globális változó a window objektum egy tulajdonságaként jön létre. Ennek több következménye is van. Egyik az az, hogy egy globális változóra hivatkozáskor elé írhatjuk a window. hivatkozást, vagy másik oldalról megközelítve, a window. hivatkozás elhagyható. A másik következménye, hogy egy globális változóra hivatkozhatunk a window objektum kulcsaként.
//Globális változók hivatkozási formái var megvalto = 'Jézus'; megvalto; //"Jézus" window.megvalto; //"Jézus" window['megvalto']; //"Jézus"
JavaScriptben számos érték lekérdezhető és beállítható a böngészőablak méretével és pozíciójával kapcsolatban. Nézzük először a lekérdezhető tulajdonságokat!
A window objektum az alábbi paramétereket teszi elérhetővé:
Annak lekérdezésére, hogy legfeljebb hány pixelnyit lehet a dokumentumot görgetni, Firefox böngészőben a scrollMaxX, scrollMaxY tulajdonságot kell használni. Vannak olyan böngészők, ahol nincs ilyen tulajdonság, ezeknél az alábbi módon lehet kiszámítani ezt az értéket:
document.documentElement.scrollHeight - document.documentElement.clientHeight
A böngészőablaknak helyet adó képernyőnek a paramétereit a window.screen objektumon keresztül lehet lekérdezni:
Az ablak helyzetét és méretét a window objektum metódusaival lehet beállítani:
Az ablak méretéhez kapcsolódóan két eseményt kell kiemelnünk:
Viszonylag gyakori igény, hogy információkat a meglévő oldal megtartása mellett jelenítsünk meg. Ennek egyik megoldásaként JavaScriptben lehetőségünk van új böngészőablakot nyitni a window objektum open metódusával, aminek általános szintaktikája a következő:
var w = window.open(url, név, tulajdonságok);
A paraméterek jelentése a következő:
Néhány fontosabb ablaknyitási paraméter a következő:
A paraméterek pontos viselkedéséről és további paraméterekről a Mozilla dokumentációjában olvashatunk.
A window.open parancs használatát az alábbi példa szemlélteti:
//Az ELTE portáljának megnyitása új ablakban var w = window.open( 'http://www.elte.hu', 'ELTEablak', 'width=800,height=600,scrollbars=yes' );
A window.open parancs visszatérési értékként egy hivatkozást ad meg az újonnan létrejött ablak window objektumára. A fenti példabeli w változó egy teljes értékű window objektum az adott ablakhoz tartozóan, és minden igaz rá, amit ebben a fejezetben a window objektumról írunk.
A szülő- és a gyerekablak kölcsönösen tud hivatkozni egymásra, és így egymás dokumentumaira is. A gyerekablakból a szülőablakot a gyerekablak window objektumának opener tulajdonságával lehet elérni (pl. w.opener a fenti példában). A gyerekablakot a window.open metódus által visszaadott objektumon keresztül érhetjük el. Amennyiben a megnyitáskori referenciát elveszítettük volna, akkor ezt úgyis megkaphatjuk, ha az url paramétert üresen hagyjuk, és csak az ablak nevét adjuk meg. Például:
var w = window.open('', 'ELTEablak');
Az oldal aktuális URL-jéhez kapcsolódó információk és metódusok a window.location objektumon keresztül érhetők el. A betöltött oldalról az alábbi adatokat szerezhetjük meg:
A paramétereket működés közben az alábbi példa demonstrálja:
// URL: // http://webprogramozas.inf.elte.hu:8080/webfejl2.html?alma=piros#valami var l = window.location; l.hash; //"#valami" l.host; //"webprogramozas.inf.elte.hu:8080" l.hostname; //"webprogramozas.inf.elte.hu" l.href; //az egész URL l.origin; //"http://webprogramozas.inf.elte.hu:8080" l.pathname; //"/webfejl2.html" l.port; //"8080" l.protocol; //"http:" l.search; //"?alma=piros"
A window.location objektumon keresztül nyílik lehetőség új oldal betöltésére JavaScript segítségével. Ennek egyik legegyszerűbb módja, ha az objektumnak értékül adjuk a betöltendő URL-t. De ugyanezt a feladatot hívatottak elősegíteni a window.location objektum metódusai is:
A böngésző előző és következő gombjához tartozó funkcionalitást a window.history objektum biztosítja. A böngésző előzményeiben való navigálást három metódus segíti elő:
//Előző oldalra lépés window.history.back(); //A következő oldalra lépés window.history.forward(); //A 3-mal ezelőtti oldal betöltése window.history.go(-3);
Bár nem a legkorszerűbb honlapszerkesztési elvek szerint készültek, mind a mai napig találkozhatunk keretekből felépülő weboldalakkal. Ezeknél a keretekbe egy-egy HTML oldal töltődik be, és mindegyikhez külön window objektum tartozik. JavaScriptben a window.frames tömbszerű gyűjteményen keresztül érhetőek el az adott keretbe illeszkedő oldalak window objektumai. Az egyes ablakokra hivatkozás történhet számmal (pl. window.frames[0]) vagy az adott keret nevével (pl. window.frames['név']). Ezen kívül lehetőség van a kerethierarchiában közvetlen felette lévő ablak elérésére a window.parent segítségével, illetve a legfelső ablakra hivatkozást a window.top adja meg.
Példaképpen tekintsük a következő kerethierarchiát, ahol az egyes keretek neve megegyezik a fájlok nevével.
Az egyes oldalak elérése a következőképpen tehető meg:
//A legfelső szinten két ablakot látunk window.frames.length; //2 //A bal.html elérése window.frames[0]; //Window bal.html window.frames['bal']; //Window bal.html //A felso.html elérése window.frames['bal'].frames['felso']; //Window felso.html //Felülről elérni a felso.html-t, majd innen a legtetejét window.frames['bal'].frames['felso'].top; //Window frame.html
A window objektumnak számos további tulajdonsága érhető el. Ebből néhány fontosabb:
A window objektum alá tartozó néhány fontosabb metódus:
A window objektum által jelzett néhány fontosabb esemény:
Adott néhány hivatkozás az oldalon.
A fenti feladatban nincsen üzleti logika, itt elsősorban a felületi elemek megfelelő kezelése a lényeg. A feladat szerint a hivatkozásra kattintva kell új ablakot nyitnunk. Az már a korábbi fejezetekből kiderült, hogy nem tanácsos egyesével a hivatkozásokhoz rendelni az eseménykezelőt, egyrészt azért, mert nem mindegyiknek az elérése egyszerű (pl. nincs azonosítója), másrészt túl sok függvény létrehozásával és kezelésével jár. Érdemes egy közös ősön kezelni az eseményt, és delegálni a hivatkozás szintjére. De melyik elem legyen a közös ős? A feladat nem mond erre konkrét utalást, mint például egy lista, vagy egy div. Ebben az esetben érdemes a legfelső, dokumentumszinten kezelni az eseményeket.
//Eseménykezelők regisztrálása function init() { document.addEventListener('click', ujablak, false); } window.addEventListener('load', init, false);
Az ujablak eseménykezelő függvényben először meg kell vizsgálni, hogy milyen elem jelezte először a kattintás eseményét. Ha ez hivatkozástól jött, akkor kiolvassuk a href attribútumát, és a window.open paranccsal új ablakot nyitunk 600x400-as méretben. Mivel nem szeretnénk, ha az eredeti oldalon is megjelenne a kattintott oldal, ezért az alapértelmezett műveletet letiltjuk az eseményobjektum preventDefault metódusával. Ezzel készen is vagyunk az a) feladatrésszel.
function ujablak(e) { if (e.target.tagName === 'A') { var a = e.target; e.preventDefault(); var url = a.href; var WIDTH = 600; var HEIGHT = 400; window.open( url, '_blank', 'width='+WIDTH+',height='+HEIGHT+',scrollbars=yes' ); } }
Következő lépésként a b) feladatban az ablak középre helyezése a cél. Ehhez nem kell mást tennünk, mint lekérdezni a böngészőt megjelenítő képernyő felbontását (window.screen.width és window.screen.height), valamint azt, hogy ennek a képernyőnek hol van a bal-felső sarka a főképernyőtől (window.screen.availTop és window.screen.availLeft). Az ablak szélességének és magasságának ismeretében már kiszámolható a bal-felső sarok pozíciója (top, left).
var top = window.screen.availTop + (window.screen.height - HEIGHT) / 2; var left = window.screen.availLeft + (window.screen.width - WIDTH) / 2;
A c) feladat szerint csak bizonyos jelölésű linkeknél kell a fenti viselkedést biztosítani. A jelölést az elem a stílusosztályában hordja. Ehhez nem kell mást csinálni, mint lekérdezni a class attribútumát az elemnek, és ha ujablak, akkor elvégezni a fenti tevékenységeket. Így a végső eseménykezelő függvény a következőképpen néz ki:
function ujablak(e) { if (e.target.tagName === 'A') { var a = e.target; if (a.getAttribute('class') === 'ujablak') { e.preventDefault(); var url = a.href; var WIDTH = 600; var HEIGHT = 400; var top = window.screen.availTop + (window.screen.height - HEIGHT) / 2; var left = window.screen.availLeft + (window.screen.width - WIDTH) / 2; window.open( url, '_blank', 'width='+WIDTH+',height='+HEIGHT+',scrollbars=yes,top='+top+',left='+left ); } } }
A tananyag az ELTE - PPKE informatika tananyagfejlesztési projekt (TÁMOP-4.1.2.A/1-11/1-2011-0052) keretében valósult meg.
A tananyag elkészítéséhez az ELTESCORM keretrendszert használtuk.