javascript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a...

25
JavaScript KSZK, WebProjekt KIR-dev team <Webtanfolyam/> el˝ oadó: Domonkos Balázs, [email protected] 2005. tavasz

Upload: others

Post on 20-Feb-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

JavaScript

KSZK, WebProjekt

KIR-dev team

<Webtanfolyam/>

eloadó:Domonkos Balázs,[email protected]

2005. tavasz

Page 2: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

TARTALOMJEGYZÉK

Ábrák jegyzéke

1. JavaScript Hello World! példa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32. Mozilla FireFox JavaScript konzol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53. A JavaScript objektumtípusainak hierachiája . . . . . . . . . . . . . . . . . . . . . . . . . 114. A leggyakrabban használt böngészok 2004 januártól 2005. márciusig . . . . . . . . . . . . 125. A leggyakrabban használt böngészok 2005. márciusában . . . . . . . . . . . . . . . . . . 12

Tartalomjegyzék

1. Mi ez? mire jó? 31.1. Helye a HTML és Java között . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2. Története . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.3. Mire használjuk? Mire ne használjuk? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2. JS alapok, szintaktika 42.1. Beágyazás HTML-be . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2. Hibajelzés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3. A nyelv alapjai röviden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.3.1. Változók . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3.2. Adattípusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3.3. Speciális konstansok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3.4. Függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3.5. Objektumok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3.6. Sztring muveletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.4. Eseménykezelés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.4.1. Letöltés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.4.2. Ablak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.4.3. Egér . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.4.4. Billentyuzet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.4.5. Urlap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.4.6. Kép . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.5. Beépített objektumok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3. Böngészo-különbségek 103.1. Böngészo lekérdezése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.2. Böngészo specifikus elemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

4. Document Object Model (DOM) 134.1. A DOM története . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.2. Mit tartalmaznak az egyes DOM szintek? . . . . . . . . . . . . . . . . . . . . . . . . . . 144.3. DHTML micro API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

A. Fogalmak 18

B. Web 18

C. Példák 19

2

Page 3: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

1. Mi ez? mire jó?

Mielott bármibe belevágnánk, alapveto HTML ismeretek birtokában érdemes elolvasni az alábbi példaforrását:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<HTML><HEAD>

<TITLE>JavaScript Hello World!</TITLE></HEAD><BODY>

<P><A href="jsexample02.html" onClick="return confirm(’Valóban törli sz oröstül-b oröstül az egész webáruházat?’)">Webáruház törlése</A></P>

</BODY></HTML>

1. ábra. JavaScript Hello World! példa

A példa érzékelteti, mire is jó a JavaScript, hogyan egészíti ki a HTML statikus dokumentum funkci-onalitásait. A linkre kattintva megerosíto ablak ugrik fel és csak az OK gomb megnyomása után navigál aböngészo a törlést végzo oldalra.

Ilyen megerosítés pure-HTML-ben csak megerosíto HTML oldal közbeiktatásával volna lehetséges,ami nehézkes, körülményes megoldás, nem is beszélve arról, hogy lassabb megoldás, mivel a közbülsooldalt külön le kell tölteni a szerverrol.

1.1. Helye a HTML és Java között

A JavaScript, ahogy a neve is mutatja script-nyelv, amelyet közvetlenül a HTML oldal forrásába ágya-zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)programot a Java Virtuális gép futtatja). A Java/JavaScript megjelenése elott (a HTML 2.0 és 3.0 ajánlásokidején) nem volt lehetoség lényeges mértéku kliens oldali interaktivitásra.

1.2. Története

JavaScript 1.0 1995 vége: „LiveScript”: a Netscape „LiveWire” projektjének elnevezésébol. A cél a We-ben egy teljes, programozható környezet létrehozása volt. A LiveScript és a Java ötvözésébol alakultki a JavaScript, melyet eloször a Netscape Navigator 2.0- ban implementáltak. Microsoft Interne-tExplorer 3.0 (JScript, gyakorlatilag megegyezik a JavaScript 1.0)

JavaScript 1.1 NN 3.0, IE 4.0

3

Page 4: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

2 JS ALAPOK, SZINTAKTIKA

JavaScript 1.2 NN 4.0

JavaScript 1.3 NN 4.06 (ECMAScript). Az ECMAScriptet a JavaScript és JScriptre támaszkodva hoztáklétre, elso verzió 1997.

ECMA-262 3. kiadás NN 6.0: JavaScript 1.5, IE 5.5, 6.0: JScript 5.6

1.3. Mire használjuk? Mire ne használjuk?

Mire használjuk?

• HTML urlap mezoinek ellenorzése elküldés elott

• A felhasználó akcióira vonatkozó válaszlépések (eseményvezérelt módon)

• HTML oldal „futási idoben” (kliens oldalon) történo generálása

• Látványos csilli-villi

• Urlapok helyi feldolgozása

Mire ne használjuk, illetve mire készüljünk fel?

• Mindig ellenorizzük a küldött urlapadatokat szerver oldalon !!!

• A JavaScript csak elvileg platformfüggetlen. Gyakorlatilag szinte minden böngészo olvasata közöttvannak kisebb-nagyobb eltérések. (Ma már szerencsére mondhatni minden grafikus böngészo támo-gatja a JavaScriptet valamilyen módon).

Ezért:

• Csak ott használjunk JavaScriptet, ahol feltétlenül szükséges

• Ha használjuk, teszteljük minél több böngészovel, de legalább a legelterjettebbekkel (MS Explorer,Mozilla, Opera).

• Mindig fel kell tételeznünk, hogy a szkriptünk nem fog lefutni helyesen, ezért ha csak tehetjük stati-kus HTML-lel is biztosítanunk kell a funkciót (pl új ablak nyitása esetén legyen link is).

• a keresorobotok nem foglalkoznak a szkriptünkkel, ezért nem is fogják megtalálni azokat az(al)oldalainkat, amelyek csak szkripten keresztül érhetok el.

2. JS alapok, szintaktika

2.1. Beágyazás HTML-be

A beágyazott szkript kódja a<script></script> tagek között adható meg szinte bár-hol a dokumentumban. Fejlécbe (<head></head> ) célszeru az inicializáló utasításokat, a törzsbe(<body></body> ) csak akkor, olyan objektumokhoz akarunk hozzáférni, ami a statikus HTML értel-mezése során jönnek létre vagy dinamikusan akarunk tartalmat generálni. Egy oldalon több program islehet, ezeket sorban hajtja végre a böngészo. A függvénydefiníciókon (ld. késobb) kívüli utasítások köz-vetlenül a</script> tag beolvasása után lefutnak.

A script tag részletesen:

<script type="MIME type" src="URL"></script>

4

Page 5: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

2.2 Hibajelzés

A MIME type alapértelmezés szerint text/javascript (lehet még VBScript(text/vbscript ) is. A régebbi HTML verziókban atype attribútum helyett alanguage att-ribútumot alkalmazták. A validitás érdekében érdemes az elobbit használni. Az URL-ben megadható,hogy a script nem a forrásban található, hanem külön állományból kell betölteni (ilyet a fejlécben szokásmegadni).

Javascript kód megadható a HTML tagek ún. eseménykezelo attribútumai értékeiként. Ilyen eseményekpl az oldal teljes letöltodésekor (onLoad ), objektumra történo kattintáskor (onClick ), urlap mezojénekmegváltozásakor (onChange ) generálódnak. Ilyet alkalmaztunk például a bevezeto hello world példájá-ban.

Link URLjeként is megadhatunk JavaScript kifejezést (ld. 2.1.). Pl.:

<a href="javascript:void(valami())">link, ami akár egy kép is lehet</a>

(Másképp nem is oldható meg „szabványosan” a képre kattintás lekezelése. AzonClick képekre csakExplorerek alatt muködik biztonsággal. A void konverzió a kimenet elnyomására kell.)

2.2. Hibajelzés

Böngészonkként eltéro. Általában a státuszsorban figyelmeztetés jelenik meg, amire kattintva bovebbleírást kapunk. Mozilla FireFox böngészo alatt az oldalon elhelyezett szkriptre vonatkozó hibák, figyal-meztetések, üzenetek a JavaScript konzolon olvashatók (Eszközök | JavaScrtip konzol).

2. ábra. Mozilla FireFox JavaScript konzol

2.3. A nyelv alapjai röviden

Just like Java just like C++ just like C. Csak a különbséget ismertetem.

2.3.1. Változók

A var kulcsszóval definiálhatunk egy vagy több új változót, a láthatóság szempontjából beszélünkglobálisés lokális változókról. Avar elhagyható, ha értéket adunk meg, azonban avar nélkül definiáltváltozók mindig globális változók lesznek. Pl.:

<script type="text/javascript">var myVar = "Global variable";

function Test() {var myVar = "Local variable";

document.writeln(myVar); // localdocument.writeln(this.myVar); // global}</script>

5

Page 6: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

2 JS ALAPOK, SZINTAKTIKA

2.3.2. Adattípusok

Nem szükséges deklarációkor megadni adattípust. Ha típuskonverzióra van szükség, akkor ez automa-tikusan végrehajtódik. Ha egy kifejezés numerikus és sztring típusú tagokat is tartalmaz akkor a numerikusértéket sztring típusúvá alakítja. Pl.:

var a = "1";var b = 2;

document.writeln(a + b);document.writeln(b + a);

A kimenet12 21 lesz.

2.3.3. Speciális konstansok

• null érték hiányát reprezentálja (numerikus kontextusban0, logikaibanfalse )

• undefined azon változók értéke, amelyeket még nem definiáltunk. Numerikus változüként történofelhasználásuk futási hibát okoz. Ezzel szemben az inicializálatlan tömbelemek tesztelésefalseeredményt ad.

2.3.4. Függvények

A függvénydefinicíó szintaxisa:

function függvénynév (paraméterek, ...){

Utasítások ...}

Egy külön tömbben is elérhetjük az átadadott argumentumokat (függvénynév.arguments ), ígypéldául változó hosszú paraméterlistát is megvalósíthatunk.

2.3.5. Objektumok

Saját objektumtípus is definiálható, de ennek nincs túl nagy gyakorlati jelentossége. Új példány létre-hozása anew operátorral történik. Pl.:

image1 = new Image();

A for..in ciklus szolgál az objektum összes elemváltozóján történo végiglépdelésre.A with kulcsszóval alapértelmetté lehet nyílvánítani egy objektumot az adott utasításblokkban. Pl.:

with(Math){document.writeln(PI);document.writeln(sin(0.5));

}

Az elemváltózók és a tömbök JavaScriptben szorosan kapcsolódnak egymáshoz, ugyanannak az adat-struktúrának más megjelenési formái. Pl.:

kocsim.gyarto = "Ford";kocsim["gyarto"] = "Ford";

Asszociatív tömbök létrehozása:

6

Page 7: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

2.3 A nyelv alapjai röviden

var ujKocsi = {gyarto:"Ford",szin:"piros",motor: {

henger:4,terf:2.2

}};

2.3.6. Sztring muveletek

A Javához hasonlóan a+ és+= a sztringkonkatenálás operátora. Sztring kifejezés megadható egyszeres(’ ) és dupla idézojelben (" ) is.

Szám típusról sztring típusra atoString függvény segítségével lehet konvertálni. Pl.:

var c = (16 * 24)/49 + 12;d = c.toString();

Sztringrol szám típusra1-gyel való szorzással lehet áttérni. FUGYULIM! Felszólít! A PHP-ben meg-szokott+0 itt nem célravezeto, mivel azt konkatenálja a sztringhez. Pl.:

Jó (d == 1234 ):

var c = ’1234’;d = c * 1;

Rossz (d == ’12340’ ):

var c = ’1234’;d = c + 0;

A sztring hossza a.length metódus segítségével kérdezheto le. Pl.:

var c = ’Hello world!’.length;

Részsztring keresése. Pl.:

var a = ’Hello world!’;document.writeln(a.indexOf(’o’))document.writeln(a.lastIndexOf(’o’))

Adott karakterpozíció (Az elso karakter indexe 0). Pl.:

var b = ’I am a JavaScript hacker.’document.writeln(b.charAt(5))

Feldarabolás adott karakterek mentén. Pl.:

var b = ’I am a JavaScript hacker.’var temp = new Array();temp = b.split(’ ’);

Az eredmény:

temp[0] = ’I’;temp[1] = ’am’;temp[2] = ’a’;temp[3] = ’JavaScript’;temp[4] = ’hacker.’;

7

Page 8: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

2 JS ALAPOK, SZINTAKTIKA

Réssztring képzése a .substring(first_index,last_index) vagy a.substr(first_index,length) metódussal történik. Pl.:

var a = ’Hello world!’;document.writeln(a.substring(4,8));document.writeln(a.substr(4,8));

Az eredmény:

’o wo’’o world!’

Kisbetus/nagybetus átalakítás:

var b = ’I am a JavaScript hacker.’;document.writeln(b.toUpperCase());document.writeln(b.toLowerCase());

2.4. Eseménykezelés

A JavaScript fontos felhasználási területe a felhasználó interakcióira történo válaszlépések leprogra-mozására. Adódik, hogy mindez ún. eseményvezérelt vezérlési szerkezettel történik. Az eseményvezérléslényege, hogy a program folyamatosan egy várakozó ciklusban fut, amíg valamilyen felhasználói vagybelso (pl. idozítés) esemény be nem következik. Ekkor lefut az adott eseményhez tartozó eseménykezelorutin, majd a program a várakozó ciklusban folytatódik a következo esemény bekövetkeztéig.

JavaScriptben a különbözo tagekhez kapcsolódó eseménykezelo függvényket a tagekon kezdetu attri-bútumaiban adhatjuk meg (betartva a attribútumértékekre vonatkozó HTML ill. XHTML eloírásokat).

Pl.:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<HTML><HEAD>

<TITLE>JavaScript Hello World!</TITLE></HEAD><BODY onLoad="alert(’Az oldal letölt odött.’)">

<P onDblClick="alert(’Köszi.’)">Kattints ide duplán!</P></BODY>

</HTML>

Az alábbiakban összefoglalom a különbözo eseménykategóriák eseményeit. Az alkalmazhatóság osz-lopában a kisbetus szó JavaScript objektumot, a csupa nagybetus HTML tagek jelöl.

2.4.1. Letöltés

esemény eseménykezelo bekövetkezik alkalmazhatóerror onError dokumentum vagy

kép letöltése hibátokoz

window, IMG

load onLoad a böngészo befejeztea dokumentum (vagyvalamennyi frame)letöltését

IMG, window

unload onUnload a felhasználó „kilép”a dokumentumból

window

8

Page 9: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

2.4 Eseménykezelés

2.4.2. Ablak

esemény eseménykezelo bekövetkezik alkalmazhatómove onMove a felhasználó moz-

gatja az ablakotwindow

resize onResize a felhasználó átmére-tezi az ablakot

window

2.4.3. Egér

esemény eseménykezelo bekövetkezik alkalmazhatóclick onClick a felhasználó egy

urlapelemre vagylinkre kattint

Button, document,Checkbox, Link,Radio, Radio, Reset,Submit

doubleclick onDblClick a felhasználó egyurlapelemre vagylinkre duplán kattint

document, Link

dragdrop onDragDrop a felhasználó egy ob-jektumot húz az ab-lakra

window

mousedown onMouseDown a felhasználó le-nyomta az egérgombját

Button, document,Link

mousemove onMouseMove a felhasználó moz-gatja az egeret

Alapértelmezés sze-rint egyetlen objek-tumhoz sem tartozik

mouseout onMouseOut az egérkurzor el-hagyta az objektumfeletti területet

Link

mouseover onMouseOver az egérkurzor el-hagyta az objektumfeletti területre került

Link

mouseup onMouseUp a felhasználó felen-gedi az egér gombját

Button, document,Link

2.4.4. Billentyuzet

esemény eseménykezelo bekövetkezik alkalmazhatókeydown onKeyDown a felhasználó lenyom

egy billentyutdocument, IMG,Link, Textarea

keypress onKeyPress a felhasználó lenyomvagy nyomva tart egybillentyut

document, IMG,Link, Textarea

keyup onKeyUp a felhasználó felen-ged egy billentyut

document, IMG,Link, Textarea

9

Page 10: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

3 BÖNGÉSZO-KÜLÖNBSÉGEK

2.4.5. Urlap

esemény eseménykezelo bekövetkezik alkalmazhatóblur onBlur az urlapelem elveszti

a fókusztButton, Checkbox,FileUpload, Pass-word, Radio, Reset,Select, Submit, Text,Textarea, window

change onChange az urlapelem tar-talma megváltozik

FileUpload, Select,Text, Textarea

focus onFocus az urlapelem kivá-lasztódik

Button, Checkbox,FileUpload, Pass-word, Radio, Reset,Select, Submit, Text,Textarea, window

reset onReset az urlap inicializáló-dik

FORM

select onSelect a felhasználó egyszövegbeviteli me-zoben kijelöl egyszöveget

Text, Textarea

submit onSubmit az urlapot elküldi afelhasználó

FORM

2.4.6. Kép

esemény eseménykezelo bekövetkezik alkalmazhatóabort onAbort a felhasználó meg-

szakítja egy kép be-töltését

IMG

2.5. Beépített objektumok

Az ábrán látható a JavaScript objektumtípusainak hierachiája. Ezen kívül fontos beépített objektumokmég:Array , Date , Math , String .

Néhány objektumot (pl.Date , Math ) a JavaScript interpreter eleve elér, mások HTML tageket jelöl-nek, ezeket nevükön kell neveznünk, hogy JavaScriptbol elérhessükoket. Pl.:

<input name="mezoNev" size="20">

Ezeknek az objektumoknak az elemváltozóit elérhetjük, olvashatjuk, írhatjuk. (A verb|document| aBODYtagnek felel meg.)

3. Böngészo-különbségek

Az alábbi tanácsokat érdemes betartani:

• Érdemes „szabványos JavaScriptet” használni.

• A böngészofejlesztok keresztbe-szivatták egymást az inkompatibilis megoldásokkal, és ennek a web-fejlesztok isszák meg a levét (és ez nem csak a JavaScriptre vonatkozik).

• Ha szükség van böngészospecifikus elemfüggvények használatára, akkor érdemes a szkriptet többböngészo szájaízére felkészíteni.

• a W3Schools 2005. januárjára vonatkozó statisztikái alapján a böngészok 11

10

Page 11: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

3.1 Böngészo lekérdezése

Window

Frame

Document

Location

History

Link

Image

Area

Anchor

Applet

Form

Textarea

FileUpload

Password

Hidden

Submit

Reset

Radio

Checkbox

Button

Select Option

navigator

Plugin

MimeType

3. ábra. A JavaScript objektumtípusainak hierachiája

3.1. Böngészo lekérdezése

// A böngész o kódnevevar browserCodeName = navigator.appCodeName;// A böngész o nevevar browserName = navigator.appName;// A böngész o verziójavar browserVersion = parseInt(navigator.appVersion);// A useragentvar userAgent = navigator.userAgent;// A böngész o platformjavar platform = navigator.platform;

Például linuxos Mozilla Firefox alatt az eredmény:

A böngész o kódneve: MozillaA böngész o neve: NetscapeA böngész o verziója: 5A useragent: Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.7.6)

11

Page 12: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

3 BÖNGÉSZO-KÜLÖNBSÉGEK

Gecko/20050325 Firefox/1.0.2 (Debian package 1.0.2-1)A böngész o platformja: Linux i686

Illetve windows-os Explorer alatt:

A böngész o kódneve: MozillaA böngész o neve: Microsoft Internet ExplorerA böngész o verziója: 4A useragent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2;.NET CLR 1.1.4322)A böngész o platformja: Win32

Kézenfekvo megoldás lenne a böngész neve és verziószáma alapján elágaztatni a JavaScript kódunkatés az adott böngészore optimalizált kódot futtani.

A W3C az alábbi statisztikákat gyujtötte az utóbbi hónapokban a világszerte használt böngészok gya-koriságáról (4. és 5. ábra)

4. ábra. A leggyakrabban használt böngészok 2004 januártól 2005. márciusig

IE 6 IE 5 Opera 7/8 Firefox Mozilla NN 4 NN 763.8% 3.9% 1.8% 21.8% 3.7% 0.2% 1.0%

5. ábra. A leggyakrabban használt böngészok 2005. márciusában

Láthatóan napjainkban IE 6 és Firefox alá érdemes optimalizálni. A böngészo ilyen lekérdezését még-sem szokták alkalmazni, hanem a böngészoket osztályokba sorolják (browser sniffer) az alapján, hogymilyen JavaScript megoldásokat használnak.

A Dynamic Drive JavaScripttel foglalkozó weboldal IE 4+, NS 4, NS 6 kategóriába sorolja a szkripteketmuködésük alapján. [5]

A dynamicdrive.com -on található browser sniffer1 osztályai:

1a sniffert kiegészítettem néhány osztállyal

12

Page 13: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

3.2 Böngészo specifikus elemek

változó leírásie Internet Explorer 4+ és IE alapú third-party böngészokie4 . . . Internet Explorer 4ie5 . . . Internet Explorer 5 - 6ie6 . . . Internet Explorer 6ns Netscapens4 Netscape 4ns6 Gecko és KDE-alapú böngészok – Netscape 6 - 7, Mozilla, Konqueror, Safarins7 . . . Netscape 7mz7 . . . minden Gecko alapú böngészo, kivéve a Netscape 7kde . . . Konqueror, KDE 2.2-tolsaf . . . Safariop Operaop5 Opera 5op6 Opera 6op7 Opera 7+nsorop Netscape vagy Operaexclude azonosítatlan böngészo

3.2. Böngészo specifikus elemek

Az oldal nettó méreteinek lekérdezése (szegély, gördítosáv nélkül):

if(ns || op) {doc_width = self.innerWidth;doc_height = self.innerHeight;} else if(ie) {doc_width = document.body.clientWidth;doc_height = document.body.clientHeight;} else {doc_width = 0;doc_height = 0;}

További böngészospecifikus elérés szükséges az ún. DOM alkalmazásához.[3] [4] [2]

4. Document Object Model (DOM)

A Document Object Model (DOM)egy olyan modell, amely leírja, hogy a HTML dokumentumegyes elemei (bekezdések, beviteli mezok, képek) hogyan viszonyulnak a legfelso szintu strukturához:adocument objektumhoz.

A DOM-on keresztül módosíthatuk, törölhetjük az elemeket, ill. új elemeket hozhatunk létre.

4.1. A DOM története

A DOM-nak három történeti szintje van:

1. A Level 0 DOM (Nulladszintu DOM)a Netscape 2 böngészoben jelent meg.

2. A Netscape 4 és Explorer 4 két eltéro ún.Intermediate DOM-ot támogatott.

3. A Level 1 DOM (Elsoszintu DOM)másnévenW3C DOMa Mozillában és az Explorer 5-ben lettbevezetve

Ebben a segédletben az elso két szint vázlatos ismertetése történik meg.

13

Page 14: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

4 DOCUMENT OBJECT MODEL (DOM)

4.2. Mit tartalmaznak az egyes DOM szintek?

Level 0 DOM

Ez a DOM szint a Netscape 2-ben a JavaScripttel egyszerre jelent meg. Néhány HTML elem (fokénturlap elemek és késobb képek) elérésére találták ki. Az Explorer 3-ban majd a többi böngészoben ugyanezta DOM-ot írták meg, így a DOM 0 szintegységes.

Urlap példa:

<FORM NAME="loginform" action="http://webtanfolyam.sch.bme.hu">Loginnév: <INPUT name="loginname"><BR>Jelszó: <INPUT name="passwd" type="password"><BR><INPUT type="submit" value="mehet" onClick="return check()">

</FORM>

...

function check(){var has_loginname = document.forms[’loginform’].elements

[’loginname’].value.length != 0;var has_passwd = document.forms[’loginform’].elements

[’passwd’].value.length != 0;

if(!has_loginname && !has_passwd) {alert("A loginnév és a jelszó mez o nincs kitöltve!");return false;

} else if(!has_loginname) {alert("A loginnév mez o nincs kitöltve!");return false;

} else if(!has_passwd) {alert("A jelszó mez o nincs kitöltve!");return false;

}

return true;}

Kép példa:

<IMG alt="kep" id="tobechanged" src="suni.jpg"onMouseOver="rabbit()" onMouseOut="suni()">

...

function rabbit() {document.images[’tobechanged’].src = ’rabbit.jpg’;

}

function suni() {document.images[’tobechanged’].src = ’suni.jpg’;

}

14

Page 15: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

4.2 Mit tartalmaznak az egyes DOM szintek?

Intermediate DOM-ok

A 4-es verziószámú böngészok jelentették a DHTML2 hajnalát. Ehhez a dokumentum minden részéhezhozzáférést kellett biztosítani. A Netscape layer-filozófiája miatt adocument.layers -ön keresztül, aMicrosoft megalomán törekvéseinek megfeleloen adocument.all -on át éri el az egyes objektumokat.

<DIV ID="tobechanged">Ezt kell<a href="javascript:eltuntet()">elrejteni...</a></DIV>

...

if(document.layers) {document.layers[’tobechanged’].visibility = ’hidden’;} else if(document.all) {document.all[’tobechanged’].style.visibility = ’hidden’;}

Level 1 DOM

A W3C hozta létre XML dokumentumok „on the fly” módosítására, de HTML dokumentumokra isalkalmas. Ezt az 5-ös verziójú böngészok támogatták.

• a Microsoft úgy döntött, hogy három DOM-ot támogat (Level 0 DOM,document.all , W3CDOM),

• a Mozilla fejleszoi úgy döntöttek, hogy nem támogatják a Netscape 4 nehézkesdocument.layers struktúráját, csak az új Level 1 DOM-ot.

A Level 1 DOM részletes ismertetését itt nem teszem meg. Ízelítoül:

x.parentNodex.childNodes[1]

document.firstChild.firstChild.lastChilddocument.firstChild.childNodes[0].lastChilddocument.firstChild.childNodes[0].childNodes[1]

document.getElementsByTagName(’B’)[0]document.getElementById(’hereweare’)

document.getElementById(’hereweare’).firstChild.nodeValue=’bold bit of text’

A legfontosabb az útóbbi metódus (document.getElementById ). A Level 1 DOM részletes is-merete nélkül ennek segítségével használhatjuk a Mozilla típusú böngészokön az Intermediate DOM-ot.Így az elozo példa:

<DIV ID="tobechanged">Ezt kell<a href="javascript:eltuntet()">elrejteni...</a></DIV>

...

if(document.layers) {

2Dinamikus HTML. A dinamikusságnak többféle olvasata van. Néha ide sorolják a CSS-t is. Ez a jegyzet úgy tárgyalja a DHTML-t, mint olyan HTML oldal, amely újratöltés nélkül változtatja szerkezetét, interaktivitást mutat

15

Page 16: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

4 DOCUMENT OBJECT MODEL (DOM)

document.layers[’tobechanged’].visibility = ’hidden’;} else if(document.all) {

document.all[’tobechanged’].style.visibility = ’hidden’;} else if(document.getElementById) {

document.getElementById(’tobechanged’).style.visibility = ’hidden’;

}

4.3. DHTML micro API

A Peter-Paul Koch által írtHTML micro API, az egységes Intermediate DOM elérésre:

function getObj(name){

if (document.getElementById){

this.obj = document.getElementById(name);this.style = document.getElementById(name).style;

}else if (document.all){

this.obj = document.all[name];this.style = document.all[name].style;

}else if (document.layers){

this.obj = document.layers[name];this.style = document.layers[name];

}}

Az elobbi példa a DHTML micro API segítségével:

function eltuntet() {var obj = new getObj(’tobechanged’);obj.style.visibility = ’hidden’;

}

[6]

16

Page 17: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

HIVATKOZÁSOK

Hivatkozások

[1] Domonkos Balázs. Javascript eloadás.2004 Nyári KIR fejlesztoi tábor, 2004.

[2] World Wide Web Consortium. Browser statistics.W3 Schools, 2005.

[3] Netscape Communications Corporation. Determining browser vendor, version, and operating systemwith javascript.The Ultimate JavaScript Client Sniffer, Version 3.03, 1999-2001.

[4] Dynamic Drive. Browser sniffer script (version 1.1).DHTML scripts for the real world, 1998-2005.

[5] Dynamic Drive. Dhtml scripts for the real world. 1998-2005.

[6] Peter-Paul Koch. Quirksmode, personal and professional site of peter-paul koch.

[7] The Web Standards Project. Dom, platform issues and cross-browser dhtml.

17

Page 18: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

B WEB

A. Fogalmak

WWW World Wide Web

W3C World Wide Web Consortium

HTML HyperText Markup Language

tag jelölo, címke, elem, SGML nyelvi elem, a dokumentum alapveto struktúrájának leírására alkalmas

attribútum egytag tulajdonságát megadó nyelvi elem, melyattribútum-névbolésattribútum-értékboláll

tartalom egy tag-hez tartozó szöveges tartalom vagy gyermek tagjei; amelyik tagnek nincs tartalma aztüres tagneknevezik

dokumentum fa a dokumentumot felépíto tagek áltál meghatározott fa (pontosabban nem fa, mert azelemek sorrendje is számít). Minden tagnek pontosan egy szülotag-je van a gyökérelemet kivéve,mert annak nincs szüloje.

felhasználó az az egyed (személy, robot, stb), amely az oldalt megtekinti

user agent (UA) azon program, amely értelmezi a forrásdokumentumot és a stíluslapokat és a megjelení-tett tartalmat eloállítja (pl. böngészo).

B. Web

• The Ultimate JavaScript Client Sniffer, Version 3.03: Determining Browser Vendor, Version, andOperating System With JavaScripthttp://www.mozilla.org/docs/web-developer/sniffer/browser_type.html

• W3 Schools: Browser Statisticshttp://www.w3schools.com/browsers/browsers_stats.asp

• Dynamic Drive: DHTML scripts for the real worldhttp://dynamicdrive.com/

• Web Standardshttp://www.webstandards.org/

• QuirksModehttp://www.quirksmode.org/js/

18

Page 19: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

C. Példák

jsexample01.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<HTML><HEAD>

<TITLE>JavaScript Hello World!</TITLE></HEAD><BODY>

<P><A href="jsexample02.html" onClick="returnconfirm(’Valóban törli sz oröstül-b oröstül az egészwebáruházat?’)">Webáruház törlése</A></P>

</BODY></HTML>

jsexample02.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<HTML><HEAD>

<TITLE>JavaScript</TITLE><SCRIPT type="text/javascript"><!--

var myVar = "Global variable";

function Test() {var myVar = "Local variable";

document.writeln(myVar); // localdocument.writeln(this.myVar); // global

}

//--></SCRIPT>

</HEAD><BODY>

<P><SCRIPT type="text/javascript"><!--

Test();//--></SCRIPT>

</P></BODY>

</HTML>

jsexample03.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<HTML><HEAD>

19

Page 20: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

C PÉLDÁK

<TITLE>JavaScript</TITLE></HEAD><BODY onLoad="alert(’Az oldal letölt odött.’)">

<P onDblClick="alert(’Köszi.’)">Kattints ide duplán!</P></BODY>

</HTML>

jsexample04.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<HTML><HEAD>

<TITLE>JavaScript</TITLE></HEAD><BODY>

<P><CODE><SCRIPT type="text/javascript"><!--

// A böngész o kódnevevar browserCodeName = navigator.appCodeName;// A böngész o nevevar browserName = navigator.appName;// A böngész o verziójavar browserVersion = parseInt(navigator.appVersion);// A useragentvar userAgent = navigator.userAgent;// A böngész o platformjavar platform = navigator.platform;

document.writeln("A böngész o kódneve: " +browserCodeName + "<BR>");document.writeln("A böngész o neve: " +browserName + "<BR>");document.writeln("A böngész o verziója: " +browserVersion + "<BR>");document.writeln("A useragent: " +userAgent + "<BR>");document.writeln("A böngész o platformja: " +platform + "<BR>");

//--></SCRIPT>

</CODE></P></BODY>

</HTML>

jsexample05.html

Csak file-ban..

jsexample06.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

20

Page 21: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

<HTML><HEAD>

<TITLE>JavaScript</TITLE><SCRIPT type="text/javascript" src="browser_sniffer.js"></SCRIPT>

</HEAD><BODY>

<P><CODE><SCRIPT type="text/javascript"><!--

if(ns || op){doc_width = self.innerWidth;doc_height = self.innerHeight;

}else if(ie){

doc_width = document.body.clientWidth;doc_height = document.body.clientHeight;

}else {

doc_width = 0;doc_height = 0;

}

document.writeln("Oldal nettó méretei: " +doc_width + "x" + doc_height);

//--></SCRIPT>

</CODE></P></BODY>

</HTML>

jsexample07.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<HTML><HEAD>

<TITLE>JavaScript</TITLE><SCRIPT type="text/javascript" src="browser_sniffer.js"></SCRIPT><SCRIPT type="text/javascript">

<!--function check(){

var has_loginname = document.forms[’loginform’].elements[’loginname’].value.length != 0;var has_passwd = document.forms[’loginform’].elements[’passwd’].value.length != 0;

if(!has_loginname && !has_passwd) {alert("A loginnév és a jelszó mez o nincs kitöltve!");return false;

}else if(!has_loginname) {

alert("A loginnév mez o nincs kitöltve!");return false;

21

Page 22: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

C PÉLDÁK

}else if(!has_passwd) {

alert("A jelszó mez o nincs kitöltve!");return false;

}

return true;}//-->

</SCRIPT></HEAD><BODY>

<FORM NAME="loginform" action="http://webtanfolyam.sch.bme.hu">Loginnév: <INPUT name="loginname"><BR>Jelszó: <INPUT name="passwd" type="password"><BR><INPUT type="submit" value="mehet" onClick="return check()">

</FORM></BODY>

</HTML>

jsexample08.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<HTML><HEAD>

<TITLE>JavaScript</TITLE><SCRIPT type="text/javascript" src="browser_sniffer.js"></SCRIPT><SCRIPT type="text/javascript">

<!--function rabbit() {

document.images[’tobechanged’].src = ’rabbit.jpg’;}

function suni() {document.images[’tobechanged’].src = ’suni.jpg’;

}//-->

</SCRIPT></HEAD><BODY>

<IMG alt="kep" id="tobechanged" src="suni.jpg"onMouseOver="rabbit()" onMouseOut="suni()">

</BODY></HTML>

jsexample09.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<HTML><HEAD>

<TITLE>JavaScript</TITLE><SCRIPT type="text/javascript" src="browser_sniffer.js"></SCRIPT>

22

Page 23: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

<SCRIPT type="text/javascript"><!--function eltuntet() {

if(document.layers) {document.layers[’tobechanged’].visibility =’hidden’;

} else if(document.all) {document.all[’tobechanged’].style.visibility = ’hidden’;

} else if(document.getElementById) {document.getElementById(’tobechanged’).style.visibility = ’hidden’;

}}//-->

</SCRIPT></HEAD><BODY>

<DIV ID="tobechanged">Ezt kell<a href="javascript:eltuntet()">elrejteni...</a></DIV>

</BODY></HTML>

jsexample10.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<HTML><HEAD>

<TITLE>JavaScript</TITLE><SCRIPT type="text/javascript" src="browser_sniffer.js"></SCRIPT><SCRIPT type="text/javascript" src="dhtmlmicroapi.js"></SCRIPT><SCRIPT type="text/javascript">

<!--function eltuntet() {

var obj = new getObj(’tobechanged’);obj.style.visibility = ’hidden’;

}//-->

</SCRIPT></HEAD><BODY>

<DIV ID="tobechanged">Ezt kell<a href="javascript:eltuntet()">elrejteni...</a></DIV>

</BODY></HTML>

jsexample11.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<HTML><HEAD>

<TITLE>JavaScript</TITLE><STYLE type="text/css">

23

Page 24: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

C PÉLDÁK

#tobechanged {position: absolute;top: 400px;left: 400px;font: 18px arial;font-weight: 700;

}</STYLE><SCRIPT type="text/javascript" src="browser_sniffer.js"></SCRIPT><SCRIPT type="text/javascript" src="dhtmlmicroapi.js"></SCRIPT><SCRIPT type="text/javascript">

<!--var textTop = 400;

function invi(flag) {if (!DHTML) return;var x = new getObj(’tobechanged’);x.style.visibility = (flag) ? ’hidden’ : ’visible’;

}

function move(amount) {if (!DHTML) return;var x = new getObj(’tobechanged’);textTop += amount;x.style.top = textTop;

}

function changeCol(col) {if (!DHTML) return;var x = new getObj(’tobechanged’);x.style.color = col;

}

function changeStyle(style) {if (!DHTML) return;var x = new getObj(’tobechanged’);x.style.fontStyle = style;

}

function changeFamily(family) {if (!DHTML) return;var x = new getObj(’tobechanged’);x.style.fontFamily = family;

}//-->

</SCRIPT></HEAD><BODY>

<DIV ID="tobechanged">Teszt szöveg</DIV><P>Szöveg <A href="javascript:invi(1)">eltüntetése</A>. </P><P>Szöveg <A href="javascript:invi(0)">megjelenítése</A>. </P><HR><P>Szöveg <A href="javascript:move(-50)">50 pixellel fentebbhelyezése</A>. </P>

24

Page 25: JavaScript - fzolee.hu zunk és azt a böngészo értelmezi és hajtja végre (ellentétben pl. a Javával, ahol a köztes kódú (byte-code)˝ programot a Java Virtuális gép futtatja)

<P>Szöveg <A href="javascript:move(50)">50 pixellel lentebbhelyezése</A>. </P><HR><P>Szöveg legyen <A href="javascript:changeCol(’#CC0000’)">piros</A>. </P><P>Szöveg legyen <A href="javascript:changeCol(’#00CC00’)">zöld</A>. </P><P>Szöveg legyen <A href="javascript:changeCol(’#000000’)">fekete</A>. </P><HR><P>Szöveg legyen <A href="javascript:changeStyle(’italic’)">dolt</A>. </P><P>Szöveg legyen <A href="javascript:changeStyle(’normal’)">normal</A>. </P><HR><P>Szöveg legyen <A href="javascript:changeFamily(’Times’)">Times</A>. </P><P>Szöveg legyen <A href="javascript:changeFamily(’Arial’)">Arial</A>. </P>

</BODY></HTML>

25