Vissza az előzőleg látogatott oldalra (nem elérhető funkció)Vissza a tananyag kezdőlapjára (P)Ugrás a tananyag előző oldalára (E)Ugrás a tananyag következő oldalára (V)Fogalom megjelenítés (nem elérhető funkció)Fogalmak listája (nem elérhető funkció)Oldal nyomtatása (nem elérhető funkció)Oldaltérkép megtekintése (D)Keresés az oldalon (nem elérhető funkció)Súgó megtekintése (S)

Bevezetés a kliens- és szerveroldali webalkalmazások készítésébe / A böngészőablak szolgáltatásai

Tanulási útmutató

Összefoglalás

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 böngészőablak szolgáltatásai

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.

A böngészőablak az asztalonA böngészőablak az asztalon

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.

A Böngésző Objektum Modell (BOM)

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 hierarchiájaA BOM hierarchiája

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.

Vissza a tartalomjegyzékhez

Globális névtér

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.

Forráskód
//Globális változók hivatkozási formái
var megvalto = 'Jézus';
megvalto;               //"Jézus"
window.megvalto;        //"Jézus"
window['megvalto'];     //"Jézus"

Vissza a tartalomjegyzékhez

Méretek és pozíció

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:

Forráskód
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:

Vissza a tartalomjegyzékhez

Új ablak nyitása

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

Forráskód
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:

Forráskód
//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:

Forráskód
var w = window.open('', 'ELTEablak');

Vissza a tartalomjegyzékhez

Az oldal URL-je

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:

Forráskód
// 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:

Vissza a tartalomjegyzékhez

Előzmények

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

Forráskód
//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);

Vissza a tartalomjegyzékhez

Keretek kezelése

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.

Példa kerethierarchiaPélda kerethierarchia

Az egyes oldalak elérése a következőképpen tehető meg:

Forráskód
//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

Vissza a tartalomjegyzékhez

További window tulajdonságok

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:

Vissza a tartalomjegyzékhez

Kidolgozott feladat

Példa

Feladat

Adott néhány hivatkozás az oldalon.

  • a) Ezekre kattintva a linkek által mutatott oldalak új ablakban nyíljanak meg!
  • b) Pozícionáljuk középre az új ablakot!
  • c) Oldjuk meg azt, hogy a fenti metódus minden olyan linkre működjön az oldalon, amelyiknek az „ujablak” stílusosztály be van állítva!

Megoldás

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.

Forráskód
//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.

Forráskód
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).

Forráskód
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:

Forráskód
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
            );
        }
    }
}

Vissza a tartalomjegyzékhez

Feladatok

Feladat
  • Rakjunk fel az oldalra három szöveges beviteli mezőt, amelyekben az új ablak nyitásához szükséges paraméterek értékeit kérjük be. Az elsőbe az URL-t, a másodikban az ablak nevét, a harmadikban az ablaknyitási paramétereket adjuk meg. Egy gomb megnyomására a felvitt értékekkel hívjuk meg az ablaknyitási parancsot.
  • Az oldalra tegyünk fel egy szöveges beviteli mezőt és egy gombot. A gombra kattintva nyíljon meg új ablak, amelyben megjelenik a mezőben megadott szöveg.
  • Adott egy legördülő lista, benne különböző oldalak neveivel. A lista elemei közül egyet választva töltődjön be az adott oldal!
  • Adott egy „Vissza” feliratú hivatkozás az oldalon. Felhasználói megerősítés után („Biztos, hogy vissza akar menni az előző oldalra?”), töltődjön be az előző oldal.

Vissza a tartalomjegyzékhez

Új Széchenyi terv
A projekt az Európai Unió támogatásával, az Európai Szociális Alap társfinanszirozásával valósul meg.

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.