Internet Explorer和JavaScript事件currentTarget

时间:2009-05-13 11:31:13

标签: javascript internet-explorer events

有没有办法用IE 7或8获取事件的当前目标?

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

但是在 Internet Explorer 中,我们没有currentTarget属性,而this指的是窗口对象!

那我怎么能这样做呢?

13 个答案:

答案 0 :(得分:30)

您可以执行类似

的操作
target = (event.currentTarget) ? event.currentTarget : event.srcElement;

虽然@Marc提到你可以使用一个JQuery框架来为你规范化事件。

答案 1 :(得分:25)

我有类似的问题。我使用an article on brainjar.com

中所述的关键字this解决了这个问题
  

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

     

...

     

function myHandler(event,link){...}

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

enter image description here

答案 2 :(得分:12)

简短的回答是:使用jQuery。

虽然在IE上无法访问event.currentTarget,但jQuery会为您规范化事件,因此您的代码也适用于IE(如here所述)

请注意,使用event.srcElement,如其他答案中所建议的那样等效,因为srcElement对应target,而不是currentTarget ,正如this page末尾所解释的那样。

答案 3 :(得分:2)

使用此函数,您可以在添加时传递对象并在侦听器中获取它。 这个问题是你有一个匿名函数作为eventlistener,在actionscript中你不能删除匿名监听器。 dunno bout js。

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。

答案 4 :(得分:1)

我假设您想要使用'this'上下文,因为相同的处理程序将处理多个可能的对象。在这种情况下,请参阅quirksmode重新编码竞赛中出色的AddEvent脚本。 (http://www.quirksmode.org/blog/archives/2005/09/addevent_recodi.html)。这段代码让我可以从html中获取最后一个javascript。更重要的是,它似乎适用于我测试过的所有浏览器。简单紧凑。

答案 5 :(得分:1)

附加说明:有时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的全局事件。

答案 6 :(得分:1)

如果它是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):

function myfunction(e) {
    alert(e.currentTarget.id);
}

e = document.getElementById('id');
e.AddEventListener(e,'mouseover',myfunction);

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

function myfunction(e) {
    alert(e.currentTarget.id);
}
e = document.getElementById('id');
eventListener(e,'mouseover',myfunction);

答案 7 :(得分:1)

使用Prototype JS,您可以使用:

var target = Event.element(event);

答案 8 :(得分:1)

Internet Explorer 6 - 8 不实现event.currentTarget。

引自Mozilla Developer Network

  

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

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

  

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

答案 9 :(得分:0)

答案 10 :(得分:0)

我想给出一个更简单的答案,其中的肉与anas'中的肉和用户1515360的答案相同:

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的浏览器上可用。

答案 11 :(得分:0)

我不确定,但这可能是一个解决方案: 因为srcElement给出的子元素不应该有一个事件,因为这会干扰父元素上的事件,而不是在事件语句的顶部元素之前的任何其他上层元素(如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 ..

答案 12 :(得分:0)

您始终可以使用闭包并传入已附加事件处理程序的元素。这些方面的东西......

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);