Maison >interface Web >js tutoriel >Explication détaillée de la différence entre target et currentTarget

Explication détaillée de la différence entre target et currentTarget

零下一度
零下一度original
2017-06-17 17:52:372485parcourir

2014-6-25

J'ai lu le manuel de jquery aujourd'hui et j'ai découvert que le module objet événement de jQuery a également un currentTarget, qui pointe toujours vers cela.

La conclusion est donc la suivante : le currentTarget natif est complètement différent du currentTarget de jQuery. Nous devrions nous concentrer sur un traitement différent.

2014-6-17

Quelle est la différence entre target et currentTarget ?

Facile à comprendre :

Par exemple, il y a A et B maintenant,

A.addChild(B)

A écoute les événements de clic de souris

Ensuite, lorsque l'on clique sur B, la cible est B et le currentTarget est A

C'est-à-dire que le currentTarget est toujours celui qui écoute l'événement, et la cible est le réel expéditeur de l'événement

Résumé :

target est dans l'étape cible du flux d'événements ; currentTarget est dans les étapes de capture, de cible et de bouillonnement du flux d'événements. Ce n'est que lorsque le flux d'événements est dans l'étape cible que les deux directions sont les mêmes. Lorsqu'il est dans les étapes de capture et de bouillonnement, la cible pointe vers l'objet cliqué et currentTarget pointe vers l'objet de l'activité événementielle en cours (généralement le). parent). classe).

Conclusion : en raison de la nécessité d'être compatible avec le navigateur IE, les événements sont généralement traités au stade de bouillonnement. À ce stade, la cible et la cible actuelle sont différentes dans certains cas.

La première place

function(e){
    var target = e.target || e.srcElement;//兼容ie7,8
    if(target){
        zIndex = $(target).zIndex();
    }
}

//往上追查调用处
enterprise.on(img,'click',enterprise.help.showHelp);

Utilisez $(target).zIndex() sous IE7-8, vous pouvez obtenir

Utilisez $(e sous IE7-8 . currentTarget).zIndex(); Il se peut qu'il n'y ait ni target ni currentTarget sous IE

Testez-le (bien sûr dans le navigateur IE)

<input type="button" id="btn1" value="我是按钮" />
<script type="text/javascript"> 
	btn1.attachEvent("onclick",function(e){
		alert(e.currentTarget);//undefined
		alert(e.target);       //undefined
		alert(e.srcElement);   //[object HTMLInputElement]
	});
</script>
La deuxième place :


$(element).on('click',jQuery.proxy(this, 'countdownHandler', this.name, this.nameAlert));
function countdownHandler(name, nameAlert){
    var _this = this,
    zIndex = 1999;//获取不到target时的默认值
    if(arguments[2] && arguments[2].currentTarget && $(arguments[2].currentTarget)){
        zIndex = $(arguments[2].currentTarget).zIndex();
        if(zIndex){
            zIndex += 1;
        }else{//获取不到z-index值
            zIndex = 1999;
        }
    }
}
L'utilisation de $(arguments[2].currentTarget).zIndex(); peut également obtenir

Conclusion estimée : cette dernière est lors de l'utilisation de jquery pour lier des événements, jQuery permet en interne à currentTarget de représenter l'élément actuel. Similaire à target sous FF/Chrome et srcElement sous IE.

Exemples en ligne :

    <p id="outer" style="background:#099">  
        click outer  
        <p id="inner" style="background:#9C0">click inner</p>  
        <br>  
    </p>  
      
    <script type="text/javascript">  
    function G(id){  
        return document.getElementById(id);      
    }  
    function addEvent(obj, ev, handler){  
        if(window.attachEvent){  
            obj.attachEvent("on" + ev, handler);  
        }else if(window.addEventListener){   
            obj.addEventListener(ev, handler, false);  
        }  
    }  
    function test(e){  
        alert("e.target.tagName : " + e.target.tagName + "/n e.currentTarget.tagName : " + e.currentTarget.tagName);  
    }  
    var outer = G("outer");  
    var inner = G("inner");  
    //addEvent(inner, "click", test);  // 两者都是P标签
    addEvent(outer, "click", test);  //结论:当在outer上点击时,e.target与e.currentTarget是一样的,都是p;当在inner上点击时,e.target是p,而e.currentTarget则是p。
    </script>

Objects this, currentTarget et target
dans
Within le programme de traitement d'événement , l'objet this est toujours égal à la valeur de currentTarget, tandis que target ne contient que la cible réelle de l'événement. Si le gestionnaire d'événements est affecté directement à l'élément cible, this, currentTarget et target contiennent les mêmes valeurs. Jetez un œil à l'exemple suivant :

var btn = document.getElementById("myBtn");
btn.onclick = function (event) {
    alert(event.currentTarget === this); //ture
    alert(event.target === this); //ture
};
Cet exemple détecte les valeurs de currentTarget, target et this. Puisque la cible de l'événement de clic est le bouton, ces trois valeurs sont égales à la fois. Si le gestionnaire d'événements existe dans le nœud parent du bouton, alors ces valeurs ne sont pas les mêmes. Regardez à nouveau l'exemple suivant :


document.body.onclick = function (event) {
    alert(event.currentTarget === document.body); //ture
    alert(this === document.body); //ture
    alert(event.target === document.getElementById("myBtn")); //ture
};
Lorsque l'on clique sur le bouton dans cet exemple, this et currentTarget sont égaux à document.body car le gestionnaire d'événements est enregistré dans cet élément. Cependant, l'élément cible est égal à l'élément bouton, pensant qu'il est la véritable cible de l'événement de clic. Puisqu'aucun gestionnaire d'événements n'est enregistré sur le bouton, l'événement click remonte jusqu'à document.body, où l'événement est géré.


Lorsque vous devez gérer plusieurs événements via une seule fonction, vous pouvez utiliser l'attribut type. Par exemple :

var btn = document.getElementById("myBtn");
var handler = function (event) {
        switch (event.type) {
        case "click":
            alert("Clicked");
            break;
        case "mouseover":
            event.target.style.backgroundColor = "red";
            bread;
        case "mouseout":
            event.target.style.backgroundColor = "";
            break;
        }
    };
btn.onclick = handler;
btn.onmouseover = handler;
btn.onmouseout = handler;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn