Crossbrowser JS esemény hozzáadása (library nélkül)
Sziasztok!
Használtam már addEventListenert is meg az IE borzasztó buta attachEvent() függvényét is. Most szeretnék egy olyan egyszerű függvényt írni ami összekombinálja a kettőt, hogy ne kelljen minden egyes eseményvezérlő hozzáadásánál if()-ekkel piszmogni, meg lehessen ciklusban is használni.
Szóval a következő kódot írtam erre a problémára:A következő kis demó oldalon meg is lehet tekinteni a HTML-el együtt.
A cél hogy a kód böngésző-konzisztens legyen tulajdonképpen teljesült is, ugyanis egyetlen egy böngészőben sem működik! :)
Én viszont azt szeretném, ha a
A Firebug dob ugyan hibaüzit (uncaught exception: [Exception... "Not enough arguments" nsresult: "0x80570001 (NS_ERROR_XPC_NOT_ENOUGH_ARGS)" location: "JS frame :: http://kismeszaros.hu/eventhandler_demo/script.js :: bindEvent :: line 3" data: no]), de ez nekem semmit sem mond! :(
Tudna valaki segíteni? - Ja igen, légyszi ne kérdezgesse senki, hogy "Miért nem használsz JQuery-t, az tud ilyet!?" - Direkt tanulás miatt írtam a kódot (no meg vannak olyan projektek, amikor az ember nem akar/nem tud library-re támaszkodni), szóval ha valaki azt is meg tudja magyarázni, hogy ez a kód MIÉRT nem működik és egy működő kód pontosan mitől is működik azért nagyon hálás lennék! :)
Előre is köszönöm!
■ Használtam már addEventListenert is meg az IE borzasztó buta attachEvent() függvényét is. Most szeretnék egy olyan egyszerű függvényt írni ami összekombinálja a kettőt, hogy ne kelljen minden egyes eseményvezérlő hozzáadásánál if()-ekkel piszmogni, meg lehessen ciklusban is használni.
Szóval a következő kódot írtam erre a problémára:
function bindEvent(obj,eventName,func,propagate){
if(obj){
if(obj.addEventListener()){
obj.addEventListner(
eventName,
func,
propagate
)
}
else if(obj.attachEvent){
obj.attachEvent(
'on'+eventName,
func
)
}
return true;}
else{
return false;}
}
function myFunction(arg){
alert(arg);
if(console){
console.log('No meghívódtam');
}
}
bindEvent(document.getElementById('mybutton'),
'click',
function(){myFunction('Helló világ!'),
false
}
);
A cél hogy a kód böngésző-konzisztens legyen tulajdonképpen teljesült is, ugyanis egyetlen egy böngészőben sem működik! :)
Én viszont azt szeretném, ha a
mybutton
gomb lenyomása meghívná a myFunction()
függvényt az adott paraméterrel, azaz ki-alertezné, hogy "Helló világ!".A Firebug dob ugyan hibaüzit (uncaught exception: [Exception... "Not enough arguments" nsresult: "0x80570001 (NS_ERROR_XPC_NOT_ENOUGH_ARGS)" location: "JS frame :: http://kismeszaros.hu/eventhandler_demo/script.js :: bindEvent :: line 3" data: no]), de ez nekem semmit sem mond! :(
Tudna valaki segíteni? - Ja igen, légyszi ne kérdezgesse senki, hogy "Miért nem használsz JQuery-t, az tud ilyet!?" - Direkt tanulás miatt írtam a kódot (no meg vannak olyan projektek, amikor az ember nem akar/nem tud library-re támaszkodni), szóval ha valaki azt is meg tudja magyarázni, hogy ez a kód MIÉRT nem működik és egy működő kód pontosan mitől is működik azért nagyon hálás lennék! :)
Előre is köszönöm!
szintaktikai hiba
,
és a}
. Talán inkább:A szintaktikai hibák elkerülése végett pedig használj konzisztens kódolási stílust (megfelelően elhelyezett szóközök / új sorok) valamint JSLint / JSHint eszközöket.
Nem csak a szintaxis hibás
4. sorban meg elírtad,
Nincsen benne semmilyen
The JavaScript Comma Operator
3. sor
Megvan!
Fura egyébként mert eredetileg asszem én is '.()' nélkül írtam, hogy
if(obj.addEventListener){...}
, nem tudom miért változtattam meg rosszra. Most már ezt is tudom, hogy ha van mögötte '.()' akkor futtatni akarja. A végén aztánin
operátort használtam. Most működik IE (8-as) és FF-ben meg Chrome-ban is. És elvileg ennek ciklusba betéve is futnia kell gondolom ha azobj=arrElements[i]
.Mondjuk tisztában vagyok vele, hogy ez elég primitív megoldás, mert ugye nem normalizálom az Event objektumot, hogy tudjak mindenhol
this
-t használni (ha jól értem Poetro linkelt kódjában ez történik), meg nincs megoldva, hogy le is tudjam szedni az eseményvezérlőt, de egyelőre ez is megteszi.Köszi még egyszer!
Az a helyzet, hogy ez már
A másik meg, hogy nem lehet egyszerűen megcsinálni, mert vannak különbségek az eventek nevei között is.
pl:
msie: onpropertychange + event.propertyName=="value"
Szóval mindenképp kell egy map, ahol adsz valami közös nevet egy-egy eseménynek, meg letárolod, hogy az event object tulajdonságait hogyan kell közös nevezőre hozni. Innentől meg már ugrott az egyszerű megoldás.
A másik lehetőség, hogy msie-ben csinálsz egy behavior-t, ami megcsinálja ugyanezt, amit írtam, csak alapból beépül a dom objektumokba (és mellesleg széteszi a procit).
Ezért csináltam
Jaja, láttam már. Nekem is
Üdw Poetro!
Amit le írtam hsz-ben is de sztem nem olvastad, a lényeg a buborékban van, mikor te a event.target -et adod át a callback függvénynek this objektumként, ami ugye azonos lesz a buborékban a target-el, szabvány szerint a this marad az amihez a listener be lett állítva. de azért sokat és sokszor segitettél már, nem kötekszem.. BéKE!
Tudom