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
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
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 *
mozes si skontrolovat, ci je v this element, ktory potrebujes - ak nie je, mozes ho hladat v parentNode targetu


samozrejme, 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
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]);
});
(Rovnou i dává do prvního argumentu 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
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
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
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);
            }
2. Ak vracia rovno funkciu na odstránenie udalosti:
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);

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: