Szerző Téma: Eseménykezelés egyszerûen  (Megtekintve 1226 alkalommal)

0 Felhasználó és 1 vendég van a témában

Nem elérhető tomi6230i

  • Törzstag
  • **
  • Hozzászólások: 354
  • Karma: +12
Re: Eseménykezelés egyszerûen
« Válasz #13 Dátum: 2011. március 05., 13:58:20 »
Hasznos volt ez a hozzászólás? 0
Pár dolog változott a programban, csatolom az új verziót.

Nem elérhető tomi6230i

  • Törzstag
  • **
  • Hozzászólások: 354
  • Karma: +12
Re: Eseménykezelés egyszerûen
« Válasz #12 Dátum: 2011. március 02., 11:07:12 »
Hasznos volt ez a hozzászólás? 0
Igen, az a lényeg, hogy több eseménnyel is működjön.
Én is csak véletlenül jöttem rá, hogy nem lehet this-t használni. Utána rágugliztam és az első találatok között azt írták, hogy így nem lehetséges. Utána mégis meg lett a megoldás. Még csak kipróbáltam, hogy működik-e, de még igazából nem mélyedtem el benne.
És még egy dologra rájöttem: az IE-s attachEvent fordított sorrendben hajtja végre a hozzárendelt eseményeket, mint a W3C-s addEventListener. Tehát fordított időrendi sorrendben.

Nem elérhető Rimelek

  • Adminisztrátor
  • Őstag
  • *****
  • Hozzászólások: 9.031
  • Karma: +288
    • rimelek.hu
Re: Eseménykezelés egyszerûen
« Válasz #11 Dátum: 2011. március 02., 09:55:32 »
Hasznos volt ez a hozzászólás? 0
Na eddig nem volt időm foglalkozni vele. Majd mikor írni akartam, láttam már megoldottad. Sebaj. Azért picit bonyolítja. Bár kommentekben mintha leírták volna azt is amit én akartam írni. Csak belenéztem. De esetedben:
Kód: Javascript
  1. function newEvent(obj,e,fgv) {
  2.         if (!obj) return false;
  3.         obj.eventHandler = fgv;
  4.         if (obj.addEventListener)
  5.                 obj.addEventListener(e, function() { obj.eventHandler(); }, false);
  6.         else if (obj.attachEvent)
  7.                 obj.attachEvent("on"+e, function() { obj.eventHandler(); });
  8. }
Erről a this dologról IE-ben még nem hallottam, hogy gond lenne. De jó tudni. De így, hogy az eseménykezelő épp a cél objektum egy metódusaként hívja meg az átadott függvényt, már IE is megérti. A linkelt oldalon is ez van, csak az első példa kicsit hosszan oldja meg tömbindexeléssel,  
Elküldve:: 2011. Március 01.  23:23:46
Ahogy este kikapcsoltam a gépet, bevillant, hogy hülyeséget írtam le. Mert ezzel így nem lehetne több eseményt hozzárendelni egy objektumhoz. És épp ezért ez az egész attachEvent és eventlisteneres megoldás.
Egyszerűen létezem, és lézengek a Földön,
mint idióta szellem, kinek kastélya a börtön.

Nem elérhető tomi6230i

  • Törzstag
  • **
  • Hozzászólások: 354
  • Karma: +12
Re: Eseménykezelés egyszerûen
« Válasz #10 Dátum: 2011. március 01., 20:18:14 »
Hasznos volt ez a hozzászólás? 0
Úgy tűnik, hogy az attachEvent IE-ben nem adja át az objektumot, amelyikre az esemény meg lett hívva, tehát a this-sel nem érhető el. Így a példáid sem működnek IE-ben.
Arra rájöttem, hogy böngészőfüggetlenül hogyan lehet átadni az objektumot egy változóban a függvény paramétereként:
Kód: Javascript
  1. function kezelo(e) {
  2.         alert(e.innerHTML);
  3. }
  4. if (obj.addEventListener)
  5.         obj.addEventListener("click", function(e){kezelo(e.target);}, false);
  6. else
  7.         obj.attachEvent("onclick", function(e){kezelo(e.srcElement);});
de szebben nem lehet megoldani? Például, hogy this-sel is működjön?

Update: azt hiszem, hogy megvan a megoldás: http://weblogs.asp.net/asmith/archive/2003/10/06/30744.aspx
« Utoljára szerkesztve: 2011. március 01., 20:37:02 írta tomi6230i »

Nem elérhető Rimelek

  • Adminisztrátor
  • Őstag
  • *****
  • Hozzászólások: 9.031
  • Karma: +288
    • rimelek.hu
Re: Eseménykezelés egyszerûen
« Válasz #9 Dátum: 2011. február 21., 20:21:19 »
Hasznos volt ez a hozzászólás? 0
Na igen, írtam olyant is, ami az én példámmal sem működött volna. Ez a String osztályos dolog. Csak gondoltam mindent amit találok aztán majd csak javítod, amit tudsz :)
Az enter a forráskódban tényleg nem valószínű az osztály definícióban, de mivel a CSS így is működik rá, a javascript is működhet. Na de így már tényleg jó. Főként a var kulcsszót hiányoltam. Direkt nem is írtam le konkrétan hogy ez a hiba oka.
Egyszerűen létezem, és lézengek a Földön,
mint idióta szellem, kinek kastélya a börtön.

Nem elérhető tomi6230i

  • Törzstag
  • **
  • Hozzászólások: 354
  • Karma: +12
Re: Eseménykezelés egyszerûen
« Válasz #8 Dátum: 2011. február 21., 18:16:54 »
Hasznos volt ez a hozzászólás? 0
Feladtad a leckét, de dolgozom az ügyön.  :)
Kössz, hogy ennyit szórakoztál vele.

Update:
Idézet
Ha van nekem is i változóm. A bekezdésre már nem teszi rá az eseményt
Na ez javítva van, helyi változókat csináltam a var kulcsszóval, mostmár tudom, hogy miért kell ezt használni.
Idézet
Osztályokkal
Javítva, kivéve az a része, amikor sortörés van az osztálynévben. De ki az, aki sortörést tesz az osztálynévbe?
Idézet
Ha nincs ilyen id (hibakonzolban obj is null)
De ez akkor is így van, ha nem a függvényemet használod, nem kell olyat megadni, ami nem létezik. De azt hiszem, hogy javítottam.
Idézet
Ha objektum a string
Passz, nem tudom. Ki az, aki így hoz létre karakterlácot tartalmazó változót?
Idézet
Az enterek miatt a htmlben
Ez az, ami nem megy. De ki az, aki sortörést tesz az osztálynévbe?
Idézet
Nincs ilyen osztály, mégis az "x" osztályúra érvényes lesz
Már nem
« Utoljára szerkesztve: 2011. február 21., 18:38:42 írta tomi6230i »

Nem elérhető Rimelek

  • Adminisztrátor
  • Őstag
  • *****
  • Hozzászólások: 9.031
  • Karma: +288
    • rimelek.hu
Re: Eseménykezelés egyszerûen
« Válasz #7 Dátum: 2011. február 21., 16:37:14 »
Hasznos volt ez a hozzászólás? 0
Na ilyesmire gondoltam. De a newEvent név nem egészen adja vissza mit is csinál a függvény, mivel ugyanazt, mint a másik, csak egy objektumra. Szóval oda vagy jobb név kéne, vagy bent hagyni addEvent-ben ahogy mutattam.

Illetve "pár" dolog van, ami nem működik. Készítettem erre neked egy tesztet. A js ki van kommentelve. A /* elé tegyél be még egy / jelet a teszteléshez. Mindig egyet tesztelj
Kód: HTML
  1.         <title>Teszt</title>
  2.         <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  3.         <script type="text/javascript" src="event.js"></script>
  4.         <style type="text/css">
Kód: CSS
  1.         div, p {
  2.                 width: 200px;
  3.                 height: 200px;
  4.         }
  5.  
  6.         div#a { background: red; }
  7.         div#b { background: blue; }
  8.         p#c { background: black; }
  9.         div#d { background: yellow; }
  10.         .p, #e { border: 3px solid blue; }
Kód: HTML
  1.         </style>
  2.         <script type="text/javascript">

Kód: Javascript
  1.         addEvent(window, 'load', function() {
  2.                 var t = ['div','p']
  3.                 /* // Ha van nekem is i változóm. A bekezdésre már nem teszi rá az eseményt
  4.                 for (i=0; i < t.length; i++) {
  5.                         addEvent(t[i], 'click', function() {
  6.                                 this.style.background = 'orange';
  7.                         });
  8.                 }
  9.                 //*/
  10.  
  11.                 /* //Osztályokkal
  12.                 var c = ['.div','.p']
  13.                 for (i=0; i < c.length; i++) {
  14.                         addEvent(c[i], 'click', function() {
  15.                                 this.style.background = 'orange';
  16.                         }); alert(":"+i);
  17.                 }
  18.                 //*/
  19.  
  20.                 /*      // Ha nincs ilyen id (hibakonzolban obj is null)
  21.                 var id = '#nincsilyenid';
  22.                 addEvent(id, 'click', function() {
  23.                         this.style.background = '#CCC';
  24.                 })
  25.                 //*/
  26.  
  27.                 /* //Ha objektum a string
  28.                 var id = new String('a');
  29.                 addEvent(id, 'click', function() {
  30.                         this.style.background = '#CCC';
  31.                 })
  32.                 */
  33.  
  34.                 /* //Az enterek miatt a htmlben
  35.                 addEvent('.p', 'click', function() {
  36.                         this.style.background = 'yellow';
  37.                 });
  38.                 //*/
  39.  
  40.                 /* //Nincs ilyen osztály, mégis az "x" osztályúra érvényes lesz
  41.                 addEvent('.o', 'click', function() {
  42.                         this.style.background = 'yellow';
  43.                 });
  44.                 //*/
  45.         })
  46.  
Kód: HTML
  1.         </script>
  2.  </head>
  3.  
  4. <div id="a" class="abc div">
  5.  
  6. </div>
  7. <div id="b" class="div">
  8.  
  9. </div>
  10.  
  11. <p id="c" class="a
  12. p
  13. b">
  14.  
  15. </p>
  16.  
  17. <div id="d" class="div">
  18.  
  19. </div>
  20. <p id="e" class="x">
  21. </p>
  22.  
  23. </body>
  24. </html>
Ezek elvileg mind nincsenek, ha úgy írod, ahogy mutattam, de jó pont, hogy nem copy paste módszerrel készítetted a példámból :)

Ja és esemény törlésnél is előjönnének a hibák, csak arra már nem írtam példát. A tags változóval is lehetnének gondok. Arra sem írtam példát.
Egyszerűen létezem, és lézengek a Földön,
mint idióta szellem, kinek kastélya a börtön.

Nem elérhető tomi6230i

  • Törzstag
  • **
  • Hozzászólások: 354
  • Karma: +12
Re: Eseménykezelés egyszerûen
« Válasz #6 Dátum: 2011. február 21., 13:24:47 »
Hasznos volt ez a hozzászólás? 0
Na elkészült az új verzió.
Ami az előzőhöz képest változott:
  • áttekinthetőbb és rövidebb kód a folyton ismételt 4 sor függvénybe helyezésével
  • osztály alapján való kiválasztás akkor is, ha több osztállyal rendelkezik az elem
  • elem kijelölése objektum megadásával
  • az azonosítóneveket #azonosító, az osztályneveket .osztály az elemneveket elemnév formában idézőjelek között kell megadni, az objektumokat idézőjelek nélkül

Kód: Javascript
  1. /*
  2.   EventHandler
  3.   2011.02.20.
  4.   László Tamás
  5.  
  6.   Ez a program megkönnyíti az események kezelését JavaScriptben.
  7.   Használatával gyorsan és könnyedén rendelhetünk objektumokhoz böngészőfüggetlenül akár több eseményt is.
  8.   Szúrd be a HTML fájlba a <script type="text/javascript" src="eventhandler.js"></script> kódot.
  9.  
  10.   Pár példa a használathoz:
  11.  
  12.   //az "elso" ID-jű elem onClick eseményére meghívódik a kattintas() függvény
  13.   addEvent("#elso","click",kattintas);
  14.  
  15.   //az előbb létrehozott esemény eltávolítása
  16.   removeEvent("#elso","click",kattintas);
  17.  
  18.   //a window objektum onLoad eseményére meghívódik a beallitasok() függvény
  19.   addEvent(window,"load",beallitasok);
  20.  
  21.   //az összes <img> elem onMouseOver eseményére meghívódik az aktivkep() függveny
  22.   addEvent("img","mouseover",aktivkep);
  23.  
  24.   //az összes red osztályú elem onMouseOver eseményére meghívódik az aktiv() függveny
  25.   addEvent(".red","mouseover",aktiv);
  26.  
  27.   //a weboldal betöltése után több esemény beállítása
  28.   function esemenyek() {
  29.         addEvent("#elso","click",kattintas);
  30.         addEvent("#masodik","mouseover",egerrajta);
  31.   }
  32.   addEvent(window,"load",esemenyek);
  33.  
  34.   //az eseménnyel rendelkező objektum elérése
  35.   function kattintas() {
  36.         alert(this.innerHTML);
  37.   }
  38.   addEvent("#elso","click",kattintas);
  39. */
  40.  
  41. //új esemény hozzáadása
  42. //a függvény meghívása: addEvent("objektum", "esemény", meghívottFüggvény);
  43. function newEvent(obj,e,fgv) {
  44.         if (obj.addEventListener)
  45.                 obj.addEventListener(e, fgv, false);
  46.         else if (obj.attachEvent)
  47.                 obj.attachEvent("on"+e, fgv);
  48. }
  49. function addEvent(obj,e,fgv) {
  50.         //esemény hozzáadása az objektum megadásával
  51.         if (typeof obj == "object")
  52.                 newEvent(obj, e, fgv);
  53.         //esemény hozzáréendelése egy objektumhoz ID alapján
  54.         else if (obj.substring(0,1)=="#")
  55.                 newEvent(document.getElementById(obj.substring(1)), e, fgv);
  56.         //esemény rendelése bizonyos osztályú elemekhez
  57.         else if (obj.substring(0,1)==".") {
  58.                 tags = document.getElementsByTagName("*");
  59.                 for (i=0; i<tags.length; i++) {
  60.                         if (tags[i].className==obj.substring(1) ||
  61.                                 tags[i].className.indexOf(obj.substring(1)+" ")==0 ||
  62.                                 tags[i].className.indexOf(" "+obj.substring(1)+" ")!=-1 ||
  63.                                 tags[i].className.indexOf(" "+obj.substring(1))==tags[i].className.length-obj.substring(1).length-1)
  64.                                 newEvent(tags[i], e, fgv);
  65.                 }
  66.         }
  67.         //esemény rendelése az összes bizonyos típusú elemhez
  68.         else {
  69.                 tags = document.getElementsByTagName(obj);
  70.                 for (i=0; i<tags.length; i++) {
  71.                         newEvent(tags[i], e, fgv);
  72.                 }
  73.         }
  74. }
  75.  
  76. //meglévő esemény törlése
  77. //a függvény meghívása: removeEvent("objektum", "esemény", meghívottFüggvény);
  78. function deleteEvent(obj,e,fgv) {
  79.         if (obj.removeEventListener)
  80.                 obj.removeEventListener(e, fgv, false);
  81.         else if (obj.detachEvent)
  82.                 obj.detachEvent("on"+e, fgv);
  83. }
  84. function removeEvent(obj,e,fgv) {
  85.         //esemény törlése az objektum megadásával
  86.         if (typeof obj == "object")
  87.                 deleteEvent(obj, e, fgv);
  88.         //esemény törlése egy objektumtól ID alapján
  89.         else if (obj.substring(0,1)=="#")
  90.                 deleteEvent(document.getElementById(obj.substring(1)), e, fgv);
  91.         //esemény törlése bizonyos osztályú elemektől
  92.         else if (obj.substring(0,1)==".") {
  93.                 tags = document.getElementsByTagName("*");
  94.                 for (i=0; i<tags.length; i++) {
  95.                         if (tags[i].className==obj.substring(1) ||
  96.                                 tags[i].className.indexOf(obj.substring(1)+" ")==0 ||
  97.                                 tags[i].className.indexOf(" "+obj.substring(1)+" ")!=-1 ||
  98.                                 tags[i].className.indexOf(" "+obj.substring(1))==tags[i].className.length-obj.substring(1).length-1)
  99.                         deleteEvent(tags[i], e, fgv);
  100.                 }
  101.         }
  102.         //esemény törlése az összes bizonyos típusú elemtől
  103.         else {
  104.                 tags = document.getElementsByTagName(obj);
  105.                 for (i=0; i<tags.length; i++) {
  106.                         deleteEvent(tags[i], e, fgv);
  107.                 }
  108.         }
  109. }

Nem elérhető tomi6230i

  • Törzstag
  • **
  • Hozzászólások: 354
  • Karma: +12
Re: Eseménykezelés egyszerûen
« Válasz #5 Dátum: 2011. február 20., 09:57:53 »
Hasznos volt ez a hozzászólás? 0
Így már értek mindent, köszönöm.

Nem elérhető Rimelek

  • Adminisztrátor
  • Őstag
  • *****
  • Hozzászólások: 9.031
  • Karma: +288
    • rimelek.hu
Re: Eseménykezelés egyszerûen
« Válasz #4 Dátum: 2011. február 19., 19:46:59 »
Hasznos volt ez a hozzászólás? +1
Nem kéne, hogy HTML-ben az ID attribútum kettőskeresztet tartalmazzon.
Én is összezavarodtam már. Mert hogy jó ideje jquery-t használok. És ott eleve # -el kel megadni az id-t. És mikor megláttam nálad, ez jutott eszembe, hogy az id. Így már más a helyzet. De csak zavarosabb nekem :)
Nem azt feltételezem, hogy egy van, hanem azt, hogy a program használója mindet megadja szóközzel elválasztva, ugyanúgy, mint a HTML-ben van.  :P
Az elég furcsa lenne. És nem igazán kivitelezhető a gyakorlatban. Nem véletlen van egy elemnek több osztálya, ha van. Ha mindet ismerjük, akkor már annyira konkrét az elem, hogy id-je is lehet.

Objektumot nem tudom, hogyan lehetne átadni. Függvény paramétere az objektum neve idézőjelek között és eval-lal lefuttatom?
Dehogyis. Hogy adod át a string változót pl? Az is objektum, csak más metódusokkal, és tulajdonságokkal, mint a document vagy a window vagy bármelyik másik node.
Lásd: http://phpstudio.hu/forum/index.php/topic,1687.msg89206.html#msg89206
Ebből az eseménykezelő:
Kód: Javascript
  1. function addEvent(obj, event, func)
  2. {
  3.         if(obj.addEventListener) {
  4.                 obj.addEventListener(event, func, false);
  5.         }else{
  6.                 obj.attachEvent("on"+event, func );
  7.         }
  8. }
  9.  
  10. function removeEvent(obj, event, func)
  11. {
  12.         if(obj.removeEventListener) {
  13.                 obj.removeEventListener(event, func, false);
  14.         }else{
  15.                 obj.detachEvent("on"+event, func);
  16.         }      
  17. }

És ezt felhasználva írhatnál olyant, ami megnézi, hogy az átadott változó, objektum micsoda. string, vagy valami más. És ha string, akkor azon belül is miket tartalmaz.

Kód: Javascript
  1. function addEvent(obj, event, func)
  2. {
  3.      if (typeof obj != 'string')
  4.     {
  5.         if(obj.addEventListener) {
  6.                 obj.addEventListener(event, func, false);
  7.         }else{
  8.                 obj.attachEvent("on"+event, func );
  9.         }
  10.         return;
  11.     }
  12.     var first = obj.substring(0,1);
  13.     if (first == '#') {
  14.          var id = obj.substring(1);
  15.            //levágod az első karaktert és getElementById-vel id-re keresel.
  16.            addEvent(document.getElementById(id), event, func);
  17.     } else if (first == '.') {
  18.           //levágod az első karaktert és osztályra keresel a függvénnyel, amit adtam. És ciklusban meghívod azaddEvent-et.
  19.           var cls = obj.substring(1);
  20.           var list = getElementsByClassName(document, cls);
  21.           for (var i = 0; i < list.length; i++ ) {
  22.                 addEvent(list[i], event, func);
  23.           }
  24.    } else {
  25.            var list = document.getElementsByTagName(obj);
  26.            //ugyanúgy a ciklus
  27.    }
  28.  
  29.  
  30. }

Egyszerűen létezem, és lézengek a Földön,
mint idióta szellem, kinek kastélya a börtön.

Nem elérhető tomi6230i

  • Törzstag
  • **
  • Hozzászólások: 354
  • Karma: +12
Re: Eseménykezelés egyszerûen
« Válasz #3 Dátum: 2011. február 19., 14:18:10 »
Hasznos volt ez a hozzászólás? 0
A #window és #document pedig mi van, ha nálam egy div-nek az id-je? :)
Idézet
Naming rules:
Must begin with a letter A-Z or a-z
Can be followed by: letters (A-Za-z), digits (0-9), hyphens ("-"), underscores ("_"), colons (":"), and periods (".")
Values are case-sensitive
Nem kéne, hogy HTML-ben az ID attribútum kettőskeresztet tartalmazzon. Én egyszer számmal kezdődőt adtam meg, és nem működött a CSS hozzá.

az osztálynál feltételezed, hogy csak egy osztálya van az elemnek.
Nem azt feltételezem, hogy egy van, hanem azt, hogy a program használója mindet megadja szóközzel elválasztva, ugyanúgy, mint a HTML-ben van.  :P
De egyébként jó ötlet, majd dolgozom rajta.

Ja még annyit, hogy ha jquery elvét használod, akkor nem kell tag: class: címkékkel kezdeni. Hanem ha .-al kezdesz akkor osztály. Ha # -el, akkor id. Ha mással, akkor tag.
Jó.

Objektumot nem tudom, hogyan lehetne átadni. Függvény paramétere az objektum neve idézőjelek között és eval-lal lefuttatom?

Többit nem értem, azokra nem tudok reagálni  :D
Kössz, hogy átböngészted :)

Nem elérhető Rimelek

  • Adminisztrátor
  • Őstag
  • *****
  • Hozzászólások: 9.031
  • Karma: +288
    • rimelek.hu
Re: Eseménykezelés egyszerûen
« Válasz #2 Dátum: 2011. február 19., 12:38:38 »
Hasznos volt ez a hozzászólás? 0
Talán átláthatóbb lenne, ha nem próbálnád két függvényben megoldani az egészet. pl mindenhol a kétféle eseménykezelést használva if-ekkel megírod. De elég lenne, ha ezt végezné egy függvény. Ami objektumot vár. Ez a kettő pedig csak azokat hívná. És már osztályokat várna. Vagy mégis maradna a két függvény, de az elején vizsgálnád, hogy objektum-e. És ha igen, akkor esemény hozzárendelés és return. Egyébként keresed az osztályt vagy id-t.És a talált objektumokra meghívod ismét a függvényt.

A #window és #document pedig mi van, ha nálam egy div-nek az id-je? :) Ezért mondom, hogy várhatna objektumot a függvény, és a probléma meg van oldva. Sokkal rövidebb lenne. Vagyis valamiben hosszabb, mert az osztálynál feltételezed, hogy csak egy osztálya van az elemnek. Pedig több is lehet. Szóval ott valami ilyesmi kéne:
Kód: Javascript
  1.         /**
  2.          * Elemek lekérdezése osztálynév alapján
  3.          */
  4.         var getElementsByClassName = function(parentObj,className,limit)
  5.         {
  6.                 if (!limit)
  7.                 {
  8.                         limit = 0;
  9.                 }
  10.                 var retnode = new Array();
  11.                 var myclass = new RegExp('(^|\\s)'+className+'($|\\s)');
  12.                 var elem = parentObj.getElementsByTagName('*');
  13.                 var j = 0;
  14.                 for (var i = 0; i < elem.length; i++)
  15.                 {
  16.                         if (limit && limit < j)
  17.                         {
  18.                                 break;
  19.                         }
  20.                         var classes = elem[i].className;
  21.                         if (myclass.test(classes))
  22.                         {
  23.                                 j++;
  24.                                 retnode.push(elem[i]);
  25.                         }
  26.                 }
  27.                 return retnode;
  28.         }
Ezt már régen írtam. Lehet, nem ez a legjobb verzió. De valami ilyesmivel tudod az osztályokat ténylegesen vizsgálni. Vagyis ezzel vissza is kapod az objektumokat.
Elküldve:: 2011. Február 19.  12:35:18
Ja még annyit, hogy ha jquery elvét használod, akkor nem kell tag: class: címkékkel kezdeni. Hanem ha .-al kezdesz akkor osztály. Ha # -el, akkor id. Ha mással, akkor tag.
Egyszerűen létezem, és lézengek a Földön,
mint idióta szellem, kinek kastélya a börtön.

Nem elérhető tomi6230i

  • Törzstag
  • **
  • Hozzászólások: 354
  • Karma: +12
Eseménykezelés egyszerûen
« Válasz #1 Dátum: 2011. február 19., 12:00:52 »
Hasznos volt ez a hozzászólás? 0
a kódban minden benne van, amit tudni kell róla
Kód: Javascript
  1. /*
  2.   EventHandler
  3.   version 2
  4.   2011.02.19.
  5.   László Tamás
  6.  
  7.   Ez a program megkönnyíti az események kezelését JavaScriptben.
  8.   Használatával gyorsan és könnyedén rendelhetünk objektumokhoz böngészőfüggetlenül akár több eseményt is.
  9.   Szúrd be a HTML fájlba a <script type="text/javascript" src="eventhandler.js"></script> kódot.
  10.  
  11.   Pár példa a használathoz:
  12.  
  13.   //az "elso" ID-jű elem onClick eseményére meghívódik a kattintas() függvény
  14.   addEvent("elso","click",kattintas);
  15.  
  16.   //az előbb létrehozott esemény eltávolítása
  17.   removeEvent("elso","click",kattintas);
  18.  
  19.   //a window objektum onLoad eseményére meghívódik a beallitasok() függvény
  20.   addEvent("#window","load",beallitasok);
  21.  
  22.   //az összes <img> elem onMouseOver eseményére meghívódik az aktivkep() függveny
  23.   addEvent("tag:img","mouseover",aktivkep);
  24.  
  25.   //az összes red osztályú elem onMouseOver eseményére meghívódik az aktiv() függveny
  26.   addEvent("class:red","mouseover",aktiv);
  27.  
  28.   //a weboldal betöltése után több esemény beállítása
  29.   function esemenyek() {
  30.         addEvent("elso","click",kattintas);
  31.         addEvent("masodik","mouseover",egerrajta);
  32.   }
  33.   addEvent("#window","load",esemenyek);
  34.  
  35.   //az eseménnyel rendelkező objektum elérése
  36.   function kattintas() {
  37.         alert(this.innerHTML);
  38.   }
  39.   addEvent("elso","click",kattintas);
  40. */
  41.  
  42. //új esemény hozzáadása
  43. //a függvény meghívása: addEvent("objektum", "esemény", meghívottFüggvény);
  44. function addEvent(id,e,fgv) {
  45.         //esemény rendelése a document objektumhoz
  46.         if (id=="#document") {
  47.                 if (document.addEventListener)
  48.                         document.addEventListener(e, fgv, false);
  49.                 else if (document.attachEvent)
  50.                         document.attachEvent("on"+e, fgv);
  51.         }
  52.         //esemény rendelése a window objektumhoz
  53.         else if (id=="#window") {
  54.                 if (window.addEventListener)
  55.                         window.addEventListener(e, fgv, false);
  56.                 else if (window.attachEvent)
  57.                         window.attachEvent("on"+e, fgv);
  58.         }
  59.         //esemény rendelése az összes bizonyos típusú elemhez
  60.         else if (id.substring(0,4)=="tag:") {
  61.                 tags = document.getElementsByTagName(id.substring(4));
  62.                 for (i=0; i<tags.length; i++) {
  63.                         if (tags[i].addEventListener)
  64.                                 tags[i].addEventListener(e, fgv, false);
  65.                         else if (tags[i].attachEvent)
  66.                                 tags[i].attachEvent("on"+e, fgv);
  67.                 }
  68.         }
  69.         //esemény rendelése bizonyos osztályú elemekhez
  70.         else if (id.substring(0,6)=="class:") {
  71.                 tags = document.getElementsByTagName("*");
  72.                 for (i=0; i<tags.length; i++) {
  73.                         if (tags[i].className!=id.substring(6)) continue;
  74.                         if (tags[i].addEventListener)
  75.                                 tags[i].addEventListener(e, fgv, false);
  76.                         else if (tags[i].attachEvent)
  77.                                 tags[i].attachEvent("on"+e, fgv);
  78.                 }
  79.         }
  80.         //esemény hozzáréendelése egy objektumhoz ID alapján
  81.         else {
  82.                 if (document.getElementById(id).addEventListener)
  83.                         document.getElementById(id).addEventListener(e, fgv, false);
  84.                 else if (document.getElementById(id).attachEvent)
  85.                         document.getElementById(id).attachEvent("on"+e, fgv);
  86.         }
  87. }
  88. //meglévő esemény törlése
  89. //a függvény meghívása: removeEvent("objektum", "esemény", meghívottFüggvény);
  90. function removeEvent(id,e,fgv) {
  91.         //document objektum eseményének eltávolítása
  92.         if (id=="#document") {
  93.                 if (document.removeEventListener)
  94.                         document.removeEventListener(e, fgv, false);
  95.                 else if (document.detachEvent)
  96.                         document.detachEvent("on"+e, fgv);
  97.         }
  98.         //window objektum eseményének eltávolítása
  99.         else if (id=="#window") {
  100.                 if (window.removeEventListener)
  101.                         window.removeEventListener(e, fgv, false);
  102.                 else if (window.detachEvent)
  103.                         window.detachEvent("on"+e, fgv);
  104.         }
  105.         //esemény rendelése az összes bizonyos típusú elemhez
  106.         else if (id.substring(0,4)=="tag:") {
  107.                 tags = document.getElementsByTagName(id.substring(4));
  108.                 for (i=0; i<tags.length; i++) {
  109.                         if (tags[i].removeEventListener)
  110.                                 tags[i].removeEventListener(e, fgv, false);
  111.                         else if (tags[i].detachEvent)
  112.                                 tags[i].detachEvent("on"+e, fgv);
  113.                 }
  114.         }
  115.         //esemény eltávolítása bizonyos osztályú elemektől
  116.         else if (id.substring(0,6)=="class:") {
  117.                 tags = document.getElementsByTagName("*");
  118.                 for (i=0; i<tags.length; i++) {
  119.                         if (tags[i].className!=id.substring(6)) continue;
  120.                         if (tags[i].removeEventListener)
  121.                                 tags[i].removeEventListener(e, fgv, false);
  122.                         else if (tags[i].detachEvent)
  123.                                 tags[i].detachEvent("on"+e, fgv);
  124.                 }
  125.         }
  126.         //objektum eseményének eltávolítása ID alapján
  127.         else {
  128.                 if (document.getElementById(id).removeEventListener)
  129.                         document.getElementById(id).removeEventListener(e, fgv, false);
  130.                 else if (document.getElementById(id).detachEvent)
  131.                         document.getElementById(id).detachEvent("on"+e, fgv);
  132.         }
  133. }
csatolom a fájlt, tömörítve is