Egyedi esemény és eseménykezelő javascript-ben.
Gondolatban elkezdtem építeni egy webes alkalmazás futtató környezetet. Az alkalmazások amik ebben futnak, értelem szerűen statikus és dinamikus html+css+js kódok összessége.
Alapvetően két különböző kisalkalmazást különböztetek meg:
- Felhasználói beavatkozást igénylő
- Felhasználói beavatkozást nem igénylő
A felhasználói beavatkozást igénylő kisalkalmazások adatokat kérnek be és azokkal végeznek munkát. Például új rekord rögzítéséhez kér be adatokat.
A felhasználói beavatkozást nem igénylő kisalkalmazások többnyire az oldal szerkezeti változásait hivatottak elvégezni. Többnyire olyan folyamatok következményei amelyek igényelnek felhasználói beavatkozás, például egy adatbevitel után frissít egy táblázatot.
Alapvetően a felhasználói beavatkozást nem igénylő kisalkalmazásokkal nem lenne semmi macera, mert lineárisan futnak le (a részfolyamatok egymást követik), viszont a felhasználói beavatkozást igénylő folyamatoknál, míg egy betöltött űrlappal vacakol a felhasználó, megszakad a kisalkalmazás folyamatossága. Nem beszélve arról, hogy az űrlap folyamata több különböző állapotba is kerülhet a folyamat végére. Lehet ugye igaz, ha a tőle elvárt folyamat teljesült, lehet ugye hamis, ha nem teljesült és keletkezhetett hiba is!
Ezek alapján ha szétbontom a kisalkalmazást több különálló folyamatra:
Adatbekérő űrlap betöltése és megjelenítése
Adatbekérő űrlap dolgozik (ez nem tudjuk meddig fog tartani, ezért itt fizikilag megszakad a folyamat)
Adatbekérő űrlap eredményének elbírálása és az eredmények alapján a folytatás
Arra gondoltam, hogy lehetne minden kisalkalmazásnak egy folyamatlistája logikai kitételekkel együtt. Így ha eljut a folyamat az állapottalansághoz akkor valójában megszakad a kisalkalmazás futtatása és a kisalkalmazás értelmező fülel, várja az éppen folyamatban lévő, de számára állapottalan folyamat kimenetét. Ha az végez, az értelmező elkapja az eredményt, behelyettesíti a folyamatlistába és minden halad tovább.
Ez azért lenne jó, mert például ha az a bizonyos űrlap AJAX-szal van elküldve és keletkezik egy kommunikációs hiba, akkor tudna dobni egy errort, amit az értelmező elkapna és megalkotná az oda vonatkozó hibaüzenetet. Vagy egy új adat rögzítése után felkínálhatná a lehetőséget, hogy szerkeszti-e user az újonnan rögzített rekordot vagy sem! És ha ez a jóváhagyó dialógus true-t dob, akkor miután az értelmező azt elkapja, indulhat az új kisalkalmazás az adatok szerkesztésével.
Eljutottam hát a kérdésemig, remélem még megtudtok szólalni (hatszor futottam neki mire le tudtam írni...ennyire sikerült értelmesre), hogyan lehet javascript-tel teljesen egyedi eseményeket és eseménykezelőt definiálni?
■ Alapvetően két különböző kisalkalmazást különböztetek meg:
- Felhasználói beavatkozást igénylő
- Felhasználói beavatkozást nem igénylő
A felhasználói beavatkozást igénylő kisalkalmazások adatokat kérnek be és azokkal végeznek munkát. Például új rekord rögzítéséhez kér be adatokat.
A felhasználói beavatkozást nem igénylő kisalkalmazások többnyire az oldal szerkezeti változásait hivatottak elvégezni. Többnyire olyan folyamatok következményei amelyek igényelnek felhasználói beavatkozás, például egy adatbevitel után frissít egy táblázatot.
Alapvetően a felhasználói beavatkozást nem igénylő kisalkalmazásokkal nem lenne semmi macera, mert lineárisan futnak le (a részfolyamatok egymást követik), viszont a felhasználói beavatkozást igénylő folyamatoknál, míg egy betöltött űrlappal vacakol a felhasználó, megszakad a kisalkalmazás folyamatossága. Nem beszélve arról, hogy az űrlap folyamata több különböző állapotba is kerülhet a folyamat végére. Lehet ugye igaz, ha a tőle elvárt folyamat teljesült, lehet ugye hamis, ha nem teljesült és keletkezhetett hiba is!
Ezek alapján ha szétbontom a kisalkalmazást több különálló folyamatra:
Adatbekérő űrlap betöltése és megjelenítése
Adatbekérő űrlap dolgozik (ez nem tudjuk meddig fog tartani, ezért itt fizikilag megszakad a folyamat)
Adatbekérő űrlap eredményének elbírálása és az eredmények alapján a folytatás
Arra gondoltam, hogy lehetne minden kisalkalmazásnak egy folyamatlistája logikai kitételekkel együtt. Így ha eljut a folyamat az állapottalansághoz akkor valójában megszakad a kisalkalmazás futtatása és a kisalkalmazás értelmező fülel, várja az éppen folyamatban lévő, de számára állapottalan folyamat kimenetét. Ha az végez, az értelmező elkapja az eredményt, behelyettesíti a folyamatlistába és minden halad tovább.
Ez azért lenne jó, mert például ha az a bizonyos űrlap AJAX-szal van elküldve és keletkezik egy kommunikációs hiba, akkor tudna dobni egy errort, amit az értelmező elkapna és megalkotná az oda vonatkozó hibaüzenetet. Vagy egy új adat rögzítése után felkínálhatná a lehetőséget, hogy szerkeszti-e user az újonnan rögzített rekordot vagy sem! És ha ez a jóváhagyó dialógus true-t dob, akkor miután az értelmező azt elkapja, indulhat az új kisalkalmazás az adatok szerkesztésével.
Eljutottam hát a kérdésemig, remélem még megtudtok szólalni (hatszor futottam neki mire le tudtam írni...ennyire sikerült értelmesre), hogyan lehet javascript-tel teljesen egyedi eseményeket és eseménykezelőt definiálni?
MIt szabad használni?
Pillants reá erre:
http://docs.jquery.com/Ajax
Persze meg lehet írni önönmagadnak is (várakozósorokba a requestek, stb) de nagyon nyüszi, böngészőinkompetenciák (van ilyen szó!!!???:-)) csomó dolog amit már itt (a jqueryben) megírtak és kivédtek.
Persze van más js függvénykönyvtár is, de annak többen sem bírjuk leírni a nevét (script...scripo..ououous:) :) :))
És ha még egy jó ötletet adhatok, már most válaszd szét a szerveroldalt és a kliensoldalt, (pl php-t a javascripttől) mert iszonyú gáz lesz utána debugolni az ilyen dolgokat:
echo "<script> var=fuggvenykem("'.$valtozo.'");</script>"; Borzalmas! :)
De lehet hogy csak nékem borzalmas :-) Remélem segített valamit, meg egyáltalán sikerült a kérdésre válaszolni :)
Gondoltam, hogy nem lesz egyszerű...
Nekem arra lenne szükségem. Elindítok egy folyamatot (ahogyan az AJAX kérés elindul) és teljesen mindegy, hogy 1 perc vagy 60 perc múlva (tudom, vannak a http kérésnek időkorlátai de itt éppen még http kérés sincs és az álapotalanság a lényeg), amikor megérkezik a válasz a folyamat megy tovább a visszatérési adatok függvényében.
Képzelje el egy olyan folyamatot, ahol egyszer csak fel kell tenni egy eldöntendő kérdést, ami nem confirm(), hanem dhtml popup Ok és Mégsem gombokkal! Amikor megjelenik, megszakad a folyamat, mert vár a felhasználói inputra.
Én azt szeretném, hogy ebben az esetben tárolt processz listből dolgozzon az értelmező, és ha az Ok vagy a Mégsem gomb megnyomásra kerül, akkor fojtatódjon a process list. Ne a DHTML kérdező dialógusom indítsa a soron következő lépést, hanem csináljon olyan eseményt amiből értelmezhető egy true, fals vagy error érték és az értelmező eldönti, minek kell következnie.
A DHTML popup olyan eseményt generál, amit az egyedi eseméyn kezelő elkap (valószínüleg valami window. vagy document.), értelemz és folytatja a folyamatokat.
Nem triviális
A prototype windows lib-ben van egy olyan megoldás, hogy az ablakok eseményeire tudsz megfigyelőket aggatni (observer) és a megfelelő ablakesemény (onClose, onMove, onMaximize stb.) bekövetkeztekor ezeket a megfigyelőket meghívja, hogy csinálják a dolgukat.
Ugyanez pepitában YUI event: http://www.dustindiaz.com/custom-events/
Vagy jMaki: https://ajax.dev.java.net/publishsubscribe.html
(Egyébként a jMaki-t érdemes szemügyre venni, igen hasznos kis jószág, most ismerkedek vele...)
Én nem értem?
A closure-k ha jól emlékszem arra valók, hogy egy bizonyos változó értékét megőrizzük azután is, hogy a js kód lefutott, magyarul a kód (függvény) "emlékszik" hogy mi volt az adott változó értéke, ojjektumorientáláskor jól jönnek, bár már régen olvastam erről a részéről a js-nek (nem is nagyon használtam, pedig jó).
Az ajax ugye asynchronous (ha akarjuk) (ez az első A :-)) és ezért gyakorlatilag nem tűnik fel a felhasználónak, hogy request megy a háttérben, tehát nem fog fagyni az oldal (jó esetben). Elmegy a request, szépen várjuk az onreadystatechange esemény változását. Közben mehetnek új requestek pl. Ha valami történik, akkor jön a függvény, ami kezeli. művelet művelet hátán, eljutunk oda hogy a felhasználónak csinálni kell valamit. Kijön a Dom div csillivilli ablak, visibility=visible vagy akár egy új createElement('div') és egyéb vezérlők belé. És ezen gombok, vagy textboxok vagy akármik eseménykezelői már új függvényeket hívnának meg, esetleg ha kell új requestel vissza a szerverhez, és stb. Én ezt így csinálnám, nem pedig egy nagy folyamatként nézném.
De lehet hogy rosszul értem a dolgot, akkor bocsi :).
Nem értetted rosszul!
Az elképzelésem szerint viszont az a kisalkalmazás értelmező ami elindítja a kisalkalmazás folyamatot, az irányít végig, azaz a keletkező állapotok alapján levezényel egy előre meghatározott forgatókönyvet, és nem a színész szól (a DHTML popup) a jelenetben a rendezőnek, hogy heló, most a "B" verzió szerint haladunk tovább.
Igazából, ahogyan olvasom a hozzászólásaitokat, és megnéztem a prototype observ és jQuery bind funkciókat, valójában az is elég lehet, ha a folyamat valóban megáll, természetesen úgy, hogy tárolódik a folyamat azonosítója meg az állapota, és mikor kész az input, az indít egy olyan általános függvényt (egy amolyan callback-et) amivela folyamat tud folytatódni.
Mel Gibson! :-)
Akkor fogjuk fel úgy, hogy ez egy olyan szinészfolyamat, amely rendezővé avanzsál, a való élet példája alapján :-)
Szerintem egy olyan nyelvnél mint a javascript, elég ha az elképzelésed megvan az adott kisalkalmazásról, amit mégis sok kicsi folyamat (függvény) rak össze. Na jó, lehetne mondjuk a kisalkalmazás egy osztály (ojjektum :-)) és a metódusai a folyamatok... Elég képlékeny nyelv, és sok "design pattern"-t kitaláltak már rá. Én ezt a folyamatos egységet nem erőltetném szigorúan.
Elgondolkodtató...
s_volenszki
off:
Egyszer már majdnem postoltam egy érdekes jelenséggel kapcsolatban, de akkor nem volt egyértelmű, most az! A labor szerverórája késik egy órát!
Closure
Ha viszont a fenti logikára van szükséged, akkor az egy eseménykezelés + záradék módszerét hazsnálhatod az azonos hatás eléréséhez:
Ezt nem teljesen értem.
Köszönöm mindenkinek,
s_volenszki
Nem a fogalom a lényeg
cseberből függvényverembe
remélem valami ilyenre gondoltál, ha nem folyt köv. :)
üdv Csaba
Szerintem ez tök jó
Legalábbis az elméletnek mindenképpen ezt a szálat kellene követnie.