如何使用attachEvent引用调用者对象("t​​his")

JCO*_*611 13 javascript internet-explorer dom this

使用.attachEvent()IE中的方法,如何引用调用者对象(触发事件的元素)this?在普通的浏览器中,使用.addEventListener,var this指向元素,而在IE中它指向window对象.

我需要它来使用以下代码:

var element = //the element, doesn't matter how it is obtained
element.addAnEvent = function(name, funct){
   if(element.addEventListener) // Works in NORMAL browsers...
   else if(element.attachEvent){
     element.attachEvent("on"+name, funct);
     //where the value of "this" in funct should point to "element"
   }
}
Run Code Online (Sandbox Code Playgroud)

我只是编写了代码,它与我的代码不完全相同,但是如果它与它一起工作则它适用于我!

use*_*716 16

这篇quirksmode文章关于attachEvent:

  1. 事件总是冒泡,没有捕获的可能性.
  2. 引用事件处理函数,而不是复制,因此this关键字始终引用窗口并且完全无用.

这两个弱点的结果是,当事件冒泡时,无法知道哪个HTML元素当前处理事件.我在事件订单页面上更全面地解释了这个问题.

由于Microsoft事件添加模型仅在Windows上由Explorer 5及更高版本支持,因此不能用于跨浏览器脚本.但即使对于仅在Windows上的Explorer应用程序,最好不要使用它,因为在复杂的应用程序中冒泡问题可能非常糟糕.

我还没有对它进行测试,但可能的解决方法可能是将处理程序包装在一个匿名函数中,该函数通过调用处理程序funct.call().

else if(element.attachEvent){
   element.attachEvent("on"+name, function(){ funct.call( element ) });
}
Run Code Online (Sandbox Code Playgroud)

对未经测试的解决方案表示歉意.我不喜欢这样做,但现在不能轻易进入IE.


Jus*_*son 10

如果你在IE中,你可以通过访问window.event.srcElement事件处理函数来获得"调用者"对象,就像你调用它一样.此对象通常称为事件目标.

var funct = function(event) {
    if ( !event ) {
        event = window.event;
    }

    var callerElement = event.target || event.srcElement;

    // Do stuff
};
Run Code Online (Sandbox Code Playgroud)

此代码未经测试,但应该将您设置为正确的方向.