Internet Explorer和JavaScript事件currentTarget
有没有一种方法可以通过IE7或IE8实现当前的活动目标 我们可以使用其他浏览器(firefox、opera、chrome等)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脚本。().
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);