`
zccst
  • 浏览: 3319180 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

target与currentTarget的区别(jqueryui方式获取z-Index)

阅读更多
作者:zccst


2014-6-25
今天看了jQuery手册,发现jQuery的事件对象模块也有一个currentTarget,始终指向this。
所以结论是:原生的currentTarget与jQuery的currentTarget完全不是一回事。要重点区别对待。



2014-6-17
target与currentTarget的区别?

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


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


结论:由于要兼容IE浏览器,所以一般都在冒泡阶段来处理事件,此时target和currentTarget有些情况下是不一样的。


第一个地方

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

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

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

测试一把(当然在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>


第二个地方:
$(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;
        }
    }
}

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

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


网上的例子:
    <div id="outer" style="background:#099">  
        click outer  
        <p id="inner" style="background:#9C0">click inner</p>  
        <br>  
    </div>  
      
    <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是一样的,都是div;当在inner上点击时,e.target是p,而e.currentTarget则是div。
    </script>




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

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

当单击这个例子中的按钮时,this和currentTarget都等于document.body,因为事件处理程序是注册到这个元素的。然而,target元素却等于按钮元素,以为它是click事件真正的目标。由于按钮上并没有注册事件处理程序,结果click事件就冒泡到了document.body,在那里事件才得到了处理。
在需要通过一个函数处理多个事件时,可以使用type属性。例如:
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;



如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
评论

相关推荐

    Javascript中, event 的 target 与 currentTarget 的区别

    在实际开发中,`event.target`常用于对触发事件的元素进行特定的DOM操作,如改变样式、获取或设置属性等,而`event.currentTarget`则更适用于处理与事件处理函数绑定的元素相关的逻辑,如更新状态、执行函数等。...

    JS target与currentTarget区别说明

    在JavaScript中,处理事件时,`target` 和 `currentTarget` 是两个非常重要的属性,它们在事件流的不同阶段有着不同的作用。理解这两个属性的区别对于编写高效且精确的事件处理程序至关重要。 首先,让我们来深入...

    微信小程序中target和currentTarget的区别小结

    在小程序中,e.target与e.currentTarget是非常重要的,尤其是涉及到页面传值时 currentTarget和target都是组件的一些属性值集合,由“data-属性名”定义的一些属性值 currentTarget:事件触发的当前事件(当前事件,...

    jQuery实现获取h1-h6标题元素值的方法

    在给定的代码中,`event.target`和`event.currentTarget`都是事件对象的属性,它们分别代表触发事件的元素和绑定事件的元素。使用这两个属性可以帮助开发者区分事件是哪个元素触发的,以及哪个元素上绑定了事件监听...

    event.currentTarget与event.target的区别介绍

    event.currentTarget identifies the current target for the event, as the event traverses the DOM. It always refers to the element the event handler has been attached to as opposed to event.target which...

    js中innerText/textContent和innerHTML与target和currentTarget的区别

    今天小编就为大家分享一篇关于js中innerText/textContent和innerHTML与target和currentTarget的区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    简单了解微信小程序 e.target与e.currentTarget的不同

    总的来说,`e.target`与`e.currentTarget`在微信小程序的事件处理中扮演着关键的角色,它们帮助开发者区分事件的来源和当前处理事件的元素,使得事件处理更加灵活和强大。掌握这两者的区别对于编写高效且正确的事件...

    微信小程序事件对象中e.target和e.currentTarget的区别详解

    总结来说,e.target和e.currentTarget的区别主要体现在它们分别表示了事件触发的源头和事件处理函数绑定的目标。e.target可以动态变化,根据点击的位置不同而指向不同的元素;e.currentTarget则是固定的,它指向的是...

    as3事件属性

    本文将深入探讨AS3事件流中的两个关键属性——`target`与`currentTarget`,并通过具体的示例来阐述它们的区别及实际应用。 #### 二、事件流基础 在AS3中,事件流主要分为三个阶段:捕获阶段(CAPTURING PHASE)、...

    在Vue中获取自定义属性方法:data-id的实例

    在Vue.js框架中,自定义属性是扩展组件功能的一个常见方式。`data-id`就是一个自定义属性,通常用于标识或区分不同的元素。本篇将详细解释如何在Vue中使用`data-id`以及与之相关的其他知识点。 1. **获取自定义属性...

    jQuery中on方法使用注意事项详解

    与`trigger`方法的区别在于,`on`方法中传递的`data`在事件绑定时就确定,而`trigger`方法中传递的数据(可以是对象或数组形式)是在事件触发时计算的。 如果一个事件处理程序被多次绑定到同一个元素,那么触发事件...

    html5跨平台开发之动画

    z-index:100;left:0.5em;top:0.5em;height:1.7em;width:1.7em;"&gt; &lt;input type="checkbox" class="ui-hide"&gt; (event);"&gt; &lt;div class="ui-menu-item-btn ui-menu-item-anim_2"&gt; &lt;div class="ui-menu-item-btn ui-...

    jquery1.11.0手册

    eq(index|-index) first() last() hasClass(class) filter(expr|obj|ele|fn) is(expr|obj|ele|fn) map(callback) has(expr|ele) not(expr|ele|fn) slice(start,[end]) 查找 children([expr]) closest(e...

    各种的jQuery版本和1.7的文档

    - jQuery 1.6:主要改进了`attr`和`prop`方法的区分,使属性和属性值的获取与设置更为精确。 - jQuery 1.7:这是一个重要的里程碑,引入了`.on()`事件绑定方法,取代了`.bind()`, `.live()`, 和 `.delegate()`,...

    HTML5自定义属性的问题分析

    在页面与js传值中我们经常用到data-id="1"的方式,然后通过e.target.dataset.id取id的值 今天在获取值时怎么也取不到 问题分析 后来发现e对象有currentTarget和target属性,而dataset就在currentTarget中,所以通过e...

    vue绑定事件后获取绑定事件中的this方法

    input v-model="checknames" @change="changecheckbox(item,$event)" style="float: right" type="checkbox" :value="index" &gt; changecheckbox(val,element) { console.log( element.currentTarget); if( ...

Global site tag (gtag.js) - Google Analytics