Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Internet Explorer和JavaScript事件currentTarget_Javascript_Internet Explorer_Events - Fatal编程技术网

Internet Explorer和JavaScript事件currentTarget

Internet Explorer和JavaScript事件currentTarget,javascript,internet-explorer,events,Javascript,Internet Explorer,Events,有没有一种方法可以通过IE7或IE8实现当前的活动目标 我们可以使用其他浏览器(firefox、opera、chrome等) event.currentTarget或者我们也可以使用this关键字 请参阅处理事件的对象 但是在Internet Explorer中我们没有currentTarget属性,此引用窗口对象 那么我该怎么做呢?我假设您想要使用“this”上下文,因为同一个处理程序将处理多个可能的对象。在这种情况下,请参阅quirksmode重新编码竞赛中优秀的AddEvent脚本。().

有没有一种方法可以通过IE7或IE8实现当前的活动目标

我们可以使用其他浏览器(firefox、opera、chrome等)
event.currentTarget
或者我们也可以使用
this
关键字 请参阅处理事件的对象

但是在Internet Explorer中我们没有
currentTarget
属性,
引用窗口对象


那么我该怎么做呢?

我假设您想要使用“this”上下文,因为同一个处理程序将处理多个可能的对象。在这种情况下,请参阅quirksmode重新编码竞赛中优秀的AddEvent脚本。(). 这段代码允许我从html中获取最后的javascript。更重要的是,它似乎适用于我测试过的所有浏览器。简单而紧凑。

简单的答案是:使用jQuery

虽然IE上无法访问
event.currentTarget
,但jQuery将为您规范化事件,以便您的代码也能在IE上工作(如上所述)


请注意,正如其他答案中所建议的那样,使用
event.srcElement
,是等效的,因为
srcElement
对应于
目标
,而不是
当前目标
,如结尾部分所述

target = (event.currentTarget) ? event.currentTarget : event.srcElement;

尽管@Marc提到,您可以使用JQuery框架为您规范化事件。

使用此函数,您可以在添加对象时传递对象,并在侦听器中获取它。 问题是您有一个匿名函数作为eventlistener,而在actionscript中您无法删除匿名侦听器。不知道

addEvent:function(object,type,listener,param)
    {
    if(object.addEventListener)
      object.addEventListener(type, function(e){ listener(object, e, param);}, false );
    else
    if(object.attachEvent)
      object.attachEvent('on'+type, function(e){ e = getEvent(e); listener(object, e, param);});
    },

getEvent:function(e)
        {
    if(!e) e = window.event; // || event
    if(e.srcElement) e.target = e.srcElement;
    return e;
    },

removeEvent:function(object,type,listener)
    {
    if(object.removeEventListener)
    object.removeEventListener(type, listener, false);
    else
    object.detachEvent('on'+type, listener);
    }

var div = document.getElementById('noobsafediv');
var div2 = document.getElementById('noobsafediv2');
addEvent(div,'mouseover',mouseover,['astring',111,div2]);


function mouseover(object,e,param)
 {
 console.log(object,e,param);
 }

这是我的框架,我称之为jNoob。

我也有类似的问题。我使用关键字
解决了它,如中所述

要获取IE中currentTarget属性的等效项,请使用 在标记中设置事件处理程序时,将此关键字用作参数

函数myHandler(事件,链接){…}

在同一页上,您可以找到下表:


附加说明:有时IE(如IE 7)会为event.target返回undefined,因此它甚至不会将其计算为true或false(无论是在if中还是在三元运算符中)。此外,即使您尝试
typeof event.target==“undefined”
它仍然会错误地说“event.target未定义”。这当然是愚蠢的,因为这就是您正在测试的
显然,在旧版IE中将事件传递到函数中是一个问题。您要解决的是:

event = event ? event : window.event;
if (typeof event.target == 'undefined') {
    var target = event.srcElement;
    } else {
    var target = event.target;
    }
请注意,您在符合标准的浏览器中重新编写事件,并获取IE的全局事件。


如果是IE,此函数将创建
currentTarget
,因此您不再需要修补代码

function eventListener(e,t,f) {
   if(e.addEventListener)
       e.addEventListener(t,f);
   else
       e.attachEvent('on' + t,
                     function(a){
                         a.currentTarget = e;
                         f(a);
                     });
}
常规JS(不适用于低于9的IE):

使用此功能(适用于9以下的IE):


使用Prototype JS,您可以使用:

var target = Event.element(event);

我想给出一个更简单的答案,其中的内容与anas和user1515360的答案中的内容相同:

if (browserDoesNotUnderstandCurrentTarget) {
        someElement.onclick = function (e) {
                if (!e) { var e = window.event; }
                e.currentTarget = someElement;
                yourCallback(e);
        }
}
else {
        someElement.onclick = yourCallback;
}
当然,可以用onclick代替任何你想要的事件


这使得e.currentTarget在不支持currentTarget的浏览器上可用。

我不确定,但这可能是一个解决方案: 由于srcmelement给出的子元素不应该有事件,因为这会干扰父元素上的事件,也不会干扰事件语句所在的顶层元素之前的任何其他上层元素(如onmosedown=“”),因此以下代码:

if (!event) event = window.event; 
if (event.currentTarget) element = event.currentTarget; 
else{element = event.srcElement; while(element.onmousedown==null) element = element.parentNode;}
if(element.nodeType==3) element=element.parentNode;  // defeat Safari bug
这似乎工作良好,直到现在与我请纠正我,如果你发现一个问题cz我需要一个解决方案
我不想使用jquery..

Internet Explorer 6-8不实现event.currentTarget

引自:

在Internet Explorer 6到8上,事件模型不同。事件侦听器使用非标准的element.attachEvent方法附加。在此模型中,没有与event.currentTarget等效的对象,这是全局对象模拟event.currentTarget功能的一个解决方案是将处理程序包装在一个函数中,使用function.prototype.call将元素作为第一个参数来调用处理程序。这样,这将是预期值。

如果仍然使用jQuery,那么jQuery负责规范化事件对象及其属性(如其他答案中多次所述)。引自:

jQuery的事件系统根据W3C标准规范化事件对象


您可以始终使用闭包并传入事件处理程序已附加到的元素。沿着这条线的东西

function handlerOnClick (currentTarget) {
    return function () {
        console.log(currentTarget);
    } 
}

var domElement = document.createElement('DIV');
domElement.innerHTML = 'Click me!';
domElement.onclick = handlerOnClick(domElement);
document.body.appendChild(domElement);

是的,我做到了。但没有找到答案…似乎IE根本不支持这一重要功能(也是IE 8),每次我必须使用该浏览器开发时,噩梦就开始了!您可以一直使用JavaScript框架,如jQuery、Prototype等。。。要抽象出这些差异,已经过去了九年多,jQuery仍然不能在API文档中保证event.currentTarget能够按预期工作。即使他们在这么多年后也没有完成,这是不可能的壮举。这不是问题的答案。而且它没有提供任何解决方案(@alvincrespo:How是我的第一行(“使用jQuery”)不是解决方案?如果OP使用jQuery,他将能够根据自己的要求在IE 7/8上使用
event.currentTarget
。我猜这是一个答案,但我假设@xdevel2000要求的是一个纯JS答案。对于任何误解,我深表歉意,并且没有解释我的评论。@AlvinRespo:没问题。很高兴你给出答案一个纯粹的JS答案(你得到了我的支持:-)。我会坚持我的观点,即跨浏览器的微妙之处最好通过现有的解决方案(例如jQuery)来处理,而不是找出它在哪里不起作用并绕过I
if (!event) event = window.event; 
if (event.currentTarget) element = event.currentTarget; 
else{element = event.srcElement; while(element.onmousedown==null) element = element.parentNode;}
if(element.nodeType==3) element=element.parentNode;  // defeat Safari bug
function handlerOnClick (currentTarget) {
    return function () {
        console.log(currentTarget);
    } 
}

var domElement = document.createElement('DIV');
domElement.innerHTML = 'Click me!';
domElement.onclick = handlerOnClick(domElement);
document.body.appendChild(domElement);