JS-mondattan:
A weboldalakba írandó JS-et a <script> tag tartalmazza:
<script type="text/javascript"> // Your code here </script>
Hogy a kódot véletlenül se hajtsa végre a böngésző, a HTML comment tagbe kell foglalni:
<script type="text/javascript"> <!-- // Your code here --> </script>
A HTML legújabb és legszigorúbb változata, az XHTML szerint a kommenteléshez a CDATA kommentelési mondattant kell alkalmaznunk:
<script type="text/javascript"><!--//--><![CDATA[//><!-- // Your code here //--><!]]></script>
Emellett az XHTML értelmében a JS-et csakis külön .js fájlban kellene tárolni!
A // jel utáni sor-rész komment.
A /* és */ jelek közötti szöveg komment.
Kód-végrehajtás:
A {} jelek közé írt kód egy tömbként kerül végrehajtásra.Az egyes rendelkezéseket pontosvesszőkkel (;) vagy sortörésekkel választhatjuk el.
A kód (ill. kód-blokkok) végrehajtási sorrendje megegyezik a fentről-lefele – balról-jobbra olvasási iránnyal. Azaz az egyes script tagekben vagy a .js dokumentumban foglalt kódokat ilyen sorrendben olvassa be a böngésző.
A screen.availWidth ill. screen.availHeight változók a felhasználó képernyőjének szélességét ill. magasságát szolgáltatják (pixelekben).
Függvények:
A függvények ismételt meghívásával sok manuális kódbeírást spórolhatunk meg. A függvények/módszerek tehát bizonyos feladatok, eljárások tárolására valók.Függvények definiálása: function függvény-név(paraméterek) {kód-blokk;}
Függvények meghívása (a helyzettől függő paraméterekkel): függvény-név(paraméterek);
Objektumok
Az objektumoknak (objects, melyek a JS-nyelv „főnevei”) vannak jellemzői (properties, mint „melléknevek”), módszerei (methods, mint „igék”) és eseményei (events).Az Objektum-orientált Programozás (OOP) a JS és a webes programozás lényege.
Az ún. mag (core) objektumok előre megadottak, implementációtól függetlenek. Sok programozást spórolhatunk meg a használatukkal.
A saját objektumok megadásához az ún. class-t használjuk.
Adat-típusok:
Az adatok (data) a JS információi, melyeket a típusuknak (pl. String/Number/Boolean) megfelelően kezel a nyelv.A null adat-típus az adat hiányát, az undefined pedig az adat (pl. változó-érték) meghatározatlanságát jelzi.
Stringek:
A string-adatokat idézőjelekbe (vagyis ún. delimiterek közé) kell írni. Az idézőjel tetszőlegesen lehet egyszeres vagy kétszeres, a lényeg, hogy az adott elem elején és végén is ugyanolyan legyen. Idézetek vagy aposztrofok egymásba ágyazásakor a bennfoglaló idézőjel és a bent lévő eltérő legyen! Jó megoldás az is, hogyha ún. escape sentence-eket használunk (kódolt karaktereket) az idézőjelek helyett, pl. \’ ill. \”.Az ASCII-betűk kódja: \xff, ahol ff hexadecimális szám.
Az Unicode-betűk kódja \uffff, ahol az utolsó négy karakter két hexadecimális számnak felel meg.
Műveletek:
A műveletekkel (operators) módosíthatjuk az adatokat. Az alkalmazott műveletek rendűsége és zárójelekkel való csoportosításuk a matematika szabályainak megfelelően történik.Változók:
A kód áttekinthetősége érdekében a változókat lehetőleg a program elején definiáljuk, ill. esetleges (újra)definiálásokat a függvényeken belül végezhetünk.A JS esetfüggő; a változó-nevek pedig számmal nem kezdődhetnek.
Adat-típusok és átalakításuk:
A prompt módszer/függvény a window objektumra vonatkozik. Két paramétere a megjelenítendő szövegre és a szövegmező alapértelmezett értékére utal:window.prompt(”szöveg”,”érték”);
A prompt-ként bevitt adatokat a program string-ként kezeli, így a + művelet nem összeadást, hanem hozzáfűzést jelent akkor is, ha a bevitt adat szám. A többi művelet azonban nem kétértelmű, így azokat szám-tartalmú stringre is matematikai műveletként hajtja végre a program; felismerve, hogy a string számként is értelmezhető.
(Ellenkező esetben a művelet értéke NaN!)
A typeof(); módszer stringként visszaadja a paraméterébe írt változó értékének típusmegnevezését (number/string/boolean/array stb.).
A JS-et rákészszeríthetjük, hogy a bevitt adatot számként értelmezze. Ennek módjai: o A Number() függvény paraméterébe írt értéket megpróbálja számmá alakítani. o A parseFloat() függvény elkezdi beolvasni a stringet, egészen addig, míg egy nem-szám karakterhez ér.
Az eddig beolvasott számokat értelmezi és visszaadja. Fontos, hogy a string számmal, vagy + ill. – jellel kezdődjön! o A parseInt() függvény a parseFloat()-hoz hasonlóan működik, de a képezhető számnak csak az egészértékét veszi fel (a tizedeseket elhagyja).
Összetett adat-típusok: az array-k és objektumok.
Az összetett adat-típusok: o Az objektumok, melyet lehetnek alapértelmezettek vagy a felhasználó által készítettek. o Arrray-k, melyek egy vagy többféle más típusú adatot tartalmaznak.Alapértelmezett JS-objektumok pl.: String, Date, Math.
A string objektum:
Stringek deifiniálási módszerei: o Implicit (=járulékos) módszer: egy változóhoz szöveges értéket rendelünk; pl. var változónév = ”érték”; o Explicit (=direkt) módszer: a String konstruktorral ténylegesen létrehozzuk a stringet, mint objektumot: var változónév = new String (”érték”); Az explicit meghatározás szabatosabb, általánosabb érvényű.
A string objektumokra vonatkozó módszerek közül kettő: indexOf() és substring().
A változó-név.indexOf(”keresett szöveg”); paranccsal a keresett szöveg karakterének helyszámát adja vissza a módszer (függvény). A string első karakterének helyszáma 0. A szóközök is karakternek számítanak.
A változó-név.substring(kezdő-index,vég-index); módszer a kezdő-indexű karaktertől a végindexű előttiig terjedő al-stringet veszi fel értékként.
A Date objektum:
A JS-ben nincs primitív (implicit) dátumadat-típus, ezért a dátum-adatok csak expliciten, azaz objektumként definiálhatók [new Date() objektum].Hogyha pl. a dátumnév.setDate(100) módszerrel egy dátumhoz túl nagy értéket rendelünk, a JS a dátum többi elemét is megváltoztatja, az eredeti dátum és a megadott érték által kifejezett időtartamnak megfelelően.
A Math objektum:
A Math objektumot csak implicit módon, azaz a használatával „definiálható”, s a string és Date objektummal ellentétben nem tárol adatot.Az Array objektum:
Az array-elemeket névvel is elnevezhetjük, pl.: var array-név = new Array(); array-név [”elem_neve”] = ”érték”;Feltétel-vizsgálatok és feltételes rendelkezések:
Az array-k elemeinek ABC-sorrendbe állítása, valamint a stringek közötti egyenlőtlenségi relációk során a JS az őket alkotó karakterek ASCII-számait veszi alapul!A feltétel-vizsgálatokkor szöveges értékek esetén az ASCII-számok alapján dönt a program. Ha az ABC-sorrendnek megfelelő, esetfügetlen összehasonlításra van szükségünk, akkor az értékeket célszerű a toUpperCase() vagy toLowerCase() függvényekkel egységes betű-esetűvé alakítani.
Hogyha objektumok (pl. explicit módon definiált stringek) közt állíptunk meg relációkat, azok magukra az objektumokra, s nem azok értékére vonatkozólag kerülnek kiértékelésre.
Ezért ha a változókat ovjektumként definiáltuk, akkor értékeik összehasonlításához a változó.valueOf() módszert kell rájuk alkalmazni.
Logikai műveletek a feltétel-vizsgálatokban: a feltételek teljesülésének egymás közötti, logikai viszonyának megfelelően megállípíthatjuk, hogy a felhasználótól kapott adat értelmes-e,m illetve a korábbi választásoknak megfelelően csökkenthetjük a további alternatívák számát.
Az értékek nem-szám (NaN) jellegének ellenőrzésére az isNaN(érték) függvény szolgál, melynek értéke true, ha az érték NaN, és false az ellenkező esetben. Objektumok értékeinek vizsgálatához ne felejtsük el használni a valueOf() módszert!
A break; parancs az adott (pl. if else) feltételes rendelkezés kód-blokkjának végrehajtását leállítja, és a következő kód-blokkra téríti át a programot.
Akkor, hogyha egy feltétel után az ÉS (&&) logikai művelet áll, a vizsgálat csak akkor folytatódik, hogyha az ÉS-feltétel teljesült. Egyébként a program nem lép be a ciklusba.
A switch feltételes rendelkezés olyan, mint a tirisztor. Hogyha az egyik case teljesül, akkor az összes következő parancsot végrehajtja a program; vagyis a case kulcsszavakat többé nem veszi
figyelembe. Ezért kell a break; paranccsal kilépni a ciklusból az adott esetben végrehajtásra kerülhető összes parancssor végén.
A for ciklust alkalmazzuk, ha a kód-részletet bizonyos számú alkalommal kell futtatni.
A while ciklust alkalmazzuk, hogyha egy feltétel teljesülése esetén akarjuk futtatni.
A do while ciklust, hogyha a feltétel teljesülésének ellenőrzése előtt egyszer mindenképpen le akarjuk futtatni a kódot.
A break; utasítással a teljes cillusból kilépünk, úgy, hogy az többé nem indul el. A continue; parancs a ciklust az adott helyen leállítja majd elölről újraindítja.
Ciklusok:
A változó-név.length() módszer segítségével megállapíthatjuk egy array elem-számát vagy egy egyszerű változó karaktereinek számát.A while ciklus a kód végrehajtása előtt ellenőrzi a feltétel teljesülését (és true esetén végrehajtja azt), míg a do while ciklus a kódot először lefuttatja, majd a végén ellenőrzi a feltételt, és míg azt érvényesnek találja, megismétli a kód futtatását.
Gyorsírás terner operátorokkal
• A függvény által kezelt objektumok stb. kapcsán túl sok if il. switch rendelkezést kéne írni. Ezt a terner operátorokkal küszöbölhetjük ki.• A terner operátorok egy if else feltételes rendelkezés-párosnak felelnek meg. Mondattanuk:
var változó-név = feltétel ? igaz-érték:hamis-érték;
pl.: var direction = x < 200 ? -1 : 1;
• A terner operátorok egymásba ágyazhatók,
pl.: var direction = x < 200 ? (x > 100 ? 0 : -1) : 1;
Változók és függvények érvényessége
• A függvényeken kívül definiált (globális) változók az egész script-re vonatkoznak. Használatukat kerüljük, inkább a függvényeken belül definiáljuk a változókat.• A függvényeken belül létrehozott (lokális) var objektumok (implicit módon definiált változók) csak az adott függvényen belülre érvényesek. (Pl.: var változó-név = ”érték”;.) Azaz az esetleg már meglévő globális változók értékét csak a függvényen belülre nézv változtathatják meg. Használatuk a többi függvény zavartalan működése érdekében előnyös.
• A függvényekben explicitmódon definiált változók (pl.: változó-név = ”érték”;) a teljes további scriptben érvényesek; azaz mind a függvényen belül, mind a további scriptre nézve felülírják azok esetleges korábbi értékeit.
Objektum-gyorsírás (object literal)
• Mint látjuk, az egymást követő scriptek azonos nevű függvényei felülírhatják egymást. Ennek kiküszöbölésére a függvényeket egy-egy objektumhoz rendelt módszerekként hozhatjuk létre.• A függvények objektumokba szervezése más programozási nyelvek (pl. C++, Java) ún. programozási osztályaira (programming classes) emlékeztet.
• Az objektumok definiálását az objektum-gyorsírással lerövidíthetjük. Az egyes rendelkezéseket itt sorvégi vesszők választják el. Mondattana:
var objektum-név= { függvény1:function() {kód1;}, függvény2:function() {kód2;}, függvény3:function() {kód3;} }
A második függvény meghívása az oldalbetöltési eseménykor (ahogy az adott objektumra vonatkozó módszerek meghívásánál már megszoktuk):
window.onload=objektum-név.függvény2;
• Az gyorsírásos objektumon belüli változók ill. array-k mondattana:
változó-név1:’érték1’, változó-név2:’érték2’, array-név1:[’első_érték’,’második_érték’,’stb’], array-név1:[’első_érték’,’második_érték’,’stb’]
Régi és modern JS-módszerek
• Elavult, kerülendő eljárások:o A document.write() parancs túlzott használata. o Az objektumok létezése/elérhetősége helyett böngésző-verziók ellenőrzése. o Sok új HTML tartalom kiíratása a már meglévő kezelése helyett.
o „Cégszerű” DOM-objektumok használata (pl. document.all a MSIE ill. document.layers a Netscape Navigator esetében).
o A <head> rész ill. a <script src=”xxx.js” type=”text/javascript” /> taggel beidézett JStömbök helyett a dokumentumtestbe írt JS-darabkák. o javascript: linkek események helyett.
• Modern, követendő eljárások:
o Elkülönített .js dokumentumokra hivatkozás.o A felhasználandó objektumok ellenőrzése a böngésző verziók helyett.
o A kliensoldali programok nélkül is jól működő oldalt lássuk el aktív bővítményekkel, és ne a szkriptek megírása után készítsük el a statikus tartalmat tartalék-képpen!
o Rövid, zárt kódot írjunk, jellemző és egyedi elnevezésekkel, mellőzve a globális változókat.
o A kód legyen jól áttekinthető, karbantartható („szellős”).
o A kód tartalmazza az értelmezéséhez szükséges kommenteket.
Kódolási javaslatok:
szellős kódváltozókat ott definiálni, ahol először használjuk,
csak a szükséges mennyiségű, helyi változó,
rendszeres ellenőrző kód-részletek [„Trükkös Iván”: rendszeresen iktassunk be ellenőrző-feltételeket (pl. objektumok támogatásának vagy változók létezésének ellenőrzésére), hogy a kód hibás futására idejekorán fény derüljön, ill. ennek megakadályozására.]
console.log(); parancs és Firebug konzol alkalmazása [alert(); helyett]!
cca. 50 sornál hosszabb kód esetén elkülönítés új dokumentumba!
Feltétlenül közöljük a felhasználóval, hogyha egy link vagy eseménykezelő új ablakra vagy lapra lép, az esetleges félreértések elkerülésére!
Ne továbbítsunk formokat, irányítsunk át oldalakat a felhasználó tudta nélkül (automatikusan)!
Kerüljük az olyan funkciók programozását, melyek a böngészőkben eleve megtalálhatók, mert azok általában többféle beviteli eszközzel, könnyebben használhatók! (Pl. „Vissza” gomb.)
Ne „animáljuk” túl az oldalt, a statikusan vagy CSS-oldalról elérhető hatásokat ill. a böngésző alapértelmezett funkcióit használjuk inkább!
Rendszeresen ellenőrizzük a böngészőben (a JS kikapcsolásával), hogy az oldal JS-támogatás nélkül is használható-e!
Az elrejtett tartalmat is le kell töltenie a felhasználónak; takarékoskodjunk a letöltendő adatmennyiséggel!
Inkább meglévő adatstruktúrákat dinamizáljunk, és ne magával a JS-tel generáljuk a tartalmat, menüket, egyéb passzív vagy aktív elemeket!
A .focus(); ill. .blur(); módszereket csak a legszükségesebb esetben alkalmazzuk, mert megbontájk a formok tabulálásának alapértelmezett hieracrhiáját, ami a kitöltést nehezíti!
Megjegyzések
Megjegyzés küldése