Autor | Zpráva | ||
---|---|---|---|
Camo Profil |
Dobrý večer,
vie mi niekto poradiť ako získam element na ktorý je naviazaná udalosť? Myslím tým situáciu pre DOM2, keď je v danom elemente ešte vnorený ďalší(bez udalosti) na ktorý sa klikne. V takom prípade event.target || event.srcElement vracajú ten vnorený element. Ale ten ja nechcem. Chcem ten obalovací na ktorý je tá udalosť naviazaná. Dúfam, že chápete o čo mi ide. Vďaka! EDIT: Bez anonymnej funkcie to chcem. Teda nie - addEventListener('click', function(event){ alert(elem); }, false); |
||
Chamurappi Profil |
#2 · Zasláno: 12. 8. 2013, 20:33:28
Reaguji na Cama:
Je v this .
„Myslím tým situáciu pre DOM2“ Nevím, čemu přesně říkáš DOM 2. Jestli addEventListener , tak tam není rozdíl oproti onclick (ani při zjišťování target u || srcElement u).
|
||
Camo Profil |
#3 · Zasláno: 12. 8. 2013, 20:41:01 · Upravil/a: Camo
Chamurappi:
Práveže target a srcElement vracajú ten vnorený element. A this mi nefunguje v IE. Trochu to osekám a pridám ešte kód. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <body> <div id="div1" style="border:1px solid red; padding:50px">div1 <div style="border:1px solid blue" id="div2">div2 </div> </div> <script type="text/javascript"> var div1=document.getElementById('div1'); var div2=document.getElementById('div2'); function handler1(event){ var event = event || window.event; var target = event.target || event.srcElement; alert(target.id); alert(this.id); } if(div1.addEventListener){ div1.addEventListener('click',handler1,false); } else{ div1.attachEvent('onclick',handler1); } </script> </body> </html> |
||
pako Profil * |
#4 · Zasláno: 12. 8. 2013, 21:58:20 · Upravil/a: pako
mozes si skontrolovat, ci je v
this element, ktory potrebujes - ak nie je, mozes ho hladat v parentNode target usamozrejme, pri viacerych vnorenych elementoch, textovych nodach atp. to bude treba prejst v cykle, v ktorom ked nebude platit tvoja podmienka nastavis target = target.parentNode
|
||
Chamurappi Profil |
#5 · Zasláno: 12. 8. 2013, 22:08:06
Reaguji na Cama:
„A this mi nefunguje v IE.“ Metoda attachEvent nepředává this . Takže nemáš problém s DOMem 2, ale s attachEvent em. Není to ekvivalent addEventListener u, je mnohem starší.
Ekvivalentní by bylo takovéto volání: div1.attachEvent('onclick', function() { return handler1.apply(div1, [window.event]); }); event objekt.)
Reaguji na paka: „mozes ho hladat v parentNode target u“
To mi připadá jako hloupé řešení, když příčina problému jde snadno obejít. |
||
Camo Profil |
#6 · Zasláno: 13. 8. 2013, 19:10:56
Chamurappi:
Díky! Takže univerzálna funkcia pre pridávanie udalostí by mohla vyzerať: div1=document.getElementById('div1'); addHandler(div1,'click',handler); function addHandler(el,type,handler){ if(el.addEventListener){ el.addEventListener(type,handler,false) } else{ el.attachEvent('on'+type,function(){ return handler.apply(el,[window.event]); }); } } Event už teda zisťovať nemusím a this ukazuje na to čo potrebujem. Výborne! Ešte raz díky. |
||
Camo Profil |
#7 · Zasláno: 13. 8. 2013, 21:13:15
Ešte by ma zaujímalo či existuje spôsob ako na tú udalosť v IE použiť detachEvent(). Asi to nepôjde. Alebo áno?
|
||
Chamurappi Profil |
#8 · Zasláno: 14. 8. 2013, 13:37:22
Reaguji na Cama:
Asi nejjednodušeji by se to dalo udělat tak, že by funkce addHandler vracela referenci na funkci, která by se dávala do detachEvent u/removeEventListener u. Při existenci addEventListener u by vrátila handler , při existenci attachEvent u by vrátila tu anonymní funkci (která by tudíž už nebyla doslova anonymní, protože by musela mít nějaké lokální jméno).
Nebo ještě jinak — addHandler by mohl vracet rovnou funkci na odebrání.
S klasikou element.onclick je mnohem snazší život :-)
|
||
Camo Profil |
Chamurappi:
No tak dík. Funguje to. 1. Ak vracia addHandler odkaz na handler ako svoju lokálnu premennú: function addHandler(el,type,handler){ var localHandler = function(){ handler.apply(el,[window.event]); } if(el.addEventListener){ el.addEventListener(type,handler,false); return handler; } else{ el.attachEvent('on'+type,localHandler); return localHandler; } } function removeHandler(el,type,handler){ if(div1.removeEventListener){ el.removeEventListener(type, handler, false); } else if(div1.detachEvent){ el.detachEvent('on'+type, handler); } } localHandler=addHandler(div1,'click',handler); a1=document.getElementById(a1); a1.onclick=function(){ removeHandler(div1,'click',localHandler); } function addHandler(el, type, handler){ var localHandler = function(){ handler.apply(el,[window.event]); } if....... else....... return function(){ if(el.removeEventListener){ el.removeEventListener('click',handler,false); } else{ el.detachEvent('onclick',localHandler); } } } removeHandler=addHandler(div1,'click',handler); a1=document.getElementById('a1'); addHandler(a1,'click',removeHandler); |
||
Časová prodleva: 11 let
|
0