target与currentTarget

target在事件流的目标阶段;currentTarget在事件流的捕获,目标及冒泡阶段。只有当事件流处在目标阶段的时候,两个的指向才是一样的, 而当处于捕获和冒泡阶段的时候,target指向被单击的对象而currentTarget指向当前事件活动的对象(一般为父级)。

比如说现在有A和B, 
A.addChild(B) 
A监听鼠标点击事件 
那么当点击B时,target是B,currentTarget是A 
也就是说,currentTarget始终是监听事件者,而target是事件的真正发出者 

第一个地方 

Js代码   收藏代码
  1. function(e){  
  2.     var target = e.target || e.srcElement;//兼容ie7,8  
  3.     if(target){  
  4.         zIndex = $(target).zIndex();  
  5.     }  
  6. }  
  7.   
  8. //往上追查调用处  
  9. enterprise.on(img,'click',enterprise.help.showHelp);  

IE7-8下使用$(target).zIndex();可以获取到 
IE7-8下使用$(e.currentTarget).zIndex();获取不到,可能是IE下既没有target,也没有currentTarget 

测试一把(当然在IE浏览器中) 
Html代码   收藏代码
  1. <input type="button" id="btn1" value="我是按钮" />  
  2. <script type="text/javascript">   
  3.     btn1.attachEvent("onclick",function(e){  
  4.         alert(e.currentTarget);//undefined  
  5.         alert(e.target);       //undefined  
  6.         alert(e.srcElement);   //[object HTMLInputElement]  
  7.     });  
  8. </script>  


第二个地方: 
Js代码   收藏代码
  1. $(element).on('click',jQuery.proxy(this'countdownHandler'this.name, this.nameAlert));  
  2. function countdownHandler(name, nameAlert){  
  3.     var _this = this,  
  4.     zIndex = 1999;//获取不到target时的默认值  
  5.     if(arguments[2] && arguments[2].currentTarget && $(arguments[2].currentTarget)){  
  6.         zIndex = $(arguments[2].currentTarget).zIndex();  
  7.         if(zIndex){  
  8.             zIndex += 1;  
  9.         }else{//获取不到z-index值  
  10.             zIndex = 1999;  
  11.         }  
  12.     }  
  13. }  

使用$(arguments[2].currentTarget).zIndex();也能获取到 

预计结论:后者是使用jquery绑定事件的,jQuery内部让currentTarget表示当前元素。类似于FF/Chrome下的target,和IE下的srcElement。 


网上的例子:  
Html代码   收藏代码
  1. <div id="outer" style="background:#099">    
  2.     click outer    
  3.     <p id="inner" style="background:#9C0">click inner</p>    
  4.     <br>    
  5. </div>    
  6.     
  7. <script type="text/javascript">    
  8. function G(id){    
  9.     return document.getElementById(id);        
  10. }    
  11. function addEvent(obj, ev, handler){    
  12.     if(window.attachEvent){    
  13.         obj.attachEvent("on" + ev, handler);    
  14.     }else if(window.addEventListener){     
  15.         obj.addEventListener(ev, handler, false);    
  16.     }    
  17. }    
  18. function test(e){    
  19.     alert("e.target.tagName : " + e.target.tagName + "\n e.currentTarget.tagName : " + e.currentTarget.tagName);    
  20. }    
  21. var outer = G("outer");    
  22. var inner = G("inner");    
  23. //addEvent(inner, "click", test);  // 两者都是P标签  
  24. addEvent(outer, "click", test);  //结论:当在outer上点击时,e.target与e.currentTarget是一样的,都是div;当在inner上点击时,e.target是p,而e.currentTarget则是div。  
  25. </script>  




对象this、currentTarget和target  
在事件处理程序内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标。如果直接将事件处理程序指定给了目标元素,则this、currentTarget和target包含相同的值。来看下面的例子: 
Js代码   收藏代码
  1. var btn = document.getElementById("myBtn");  
  2. btn.onclick = function (event) {  
  3.     alert(event.currentTarget === this); //ture  
  4.     alert(event.target === this); //ture  
  5. };  

这个例子检测了currentTarget和target与this的值。由于click事件的目标是按钮,一次这三个值是相等的。如果事件处理程序存在于按钮的父节点中,那么这些值是不相同的。再看下面的例子: 
Js代码   收藏代码
  1. document.body.onclick = function (event) {  
  2.     alert(event.currentTarget === document.body); //ture  
  3.     alert(this === document.body); //ture  
  4.     alert(event.target === document.getElementById("myBtn")); //ture  
  5. };  

当单击这个例子中的按钮时,this和currentTarget都等于document.body,因为事件处理程序是注册到这个元素的。然而,target元素却等于按钮元素,以为它是click事件真正的目标。由于按钮上并没有注册事件处理程序,结果click事件就冒泡到了document.body,在那里事件才得到了处理。 
在需要通过一个函数处理多个事件时,可以使用type属性。例如: 
Js代码   收藏代码
  1. var btn = document.getElementById("myBtn");  
  2. var handler = function (event) {  
  3.         switch (event.type) {  
  4.         case "click":  
  5.             alert("Clicked");  
  6.             break;  
  7.         case "mouseover":  
  8.             event.target.style.backgroundColor = "red";  
  9.             bread;  
  10.         case "mouseout":  
  11.             event.target.style.backgroundColor = "";  
  12.             break;  
  13.         }  
  14.     };  
  15. btn.onclick = handler;  
  16. btn.onmouseover = handler;  
  17. btn.onmouseout = handler;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值