| 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í targetu || srcElementu).
|
||
| 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 targetusamozrejme, 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 attachEventem. Není to ekvivalent addEventListeneru, 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 targetu“
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 detachEventu/removeEventListeneru. Při existenci addEventListeneru by vrátila handler, při existenci attachEventu 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: 13 let
|
|||
0