可能的重复:
如何使用attachEvent 引用调用方对象("this")
这不是完全重复的。请看下面我的答案,与假设的副本相比
我可能偏离了我的术语,所以请随时纠正我。也许这就是为什么我似乎找不到任何相关的东西。没有库,请。
我有一个事件处理程序,它调用一个回调函数。很想,对吧?在IE<9处理程序中的CCD_ 1对象是窗口。我不知道为什么,也不知道如何访问正确的对象。
if (document.addEventListener){
element.addEventListener(event, callback, false);
} else {
element.attachEvent('on' +event, callback);
}
此部分确实有效。
这部分没有:
function callback(event){
console.log(this);
}
IE中的this
返回[object Window]
,而它在其他浏览器中返回调用callback
函数的元素。这是从我的完整剧本中大幅删减的,但这应该是所有相关的内容。
编辑
此链接由@metadings提供如何使用attachEvent引用调用方对象("this")非常接近。然而,仍然存在两个问题。
1) 我需要得到调用此函数的event object
和DOM element
。
2) 此事件是以委托方式处理的:可能有子DOM元素触发事件,这意味着event.target
不一定(在我的情况下,通常也不是)具有侦听器的元素。
好吧,闭包是正确的方法。以下是上面场景的答案:
(function(element, event){
element.attachEvent(
'on' + event,
function(e){
callback(e, element);
}
);
})(element, event);
就是这样!回调接收作为event object
的e
和作为激发侦听器(不一定是事件目标)的this
1的element
。
然后在回调中:
function callback(event, obj){
obj = obj || this;
console.log(event, obj);
}
按照链接中的建议,尝试使用匿名函数和.call,使callback()
中的this
变成了event object
,但没有成功。
我投票决定结束这个,但似乎你错过了争论,所以像这个
element.attachEvent("on"+event, function(){ callback.apply( element, arguments ); });