在Javascript中,在IE8中,对象的方法附加在事件保持窗口对象'而是将对象本身放在'这个'

时间:2014-12-31 04:43:58

标签: javascript internet-explorer events methods internet-explorer-8

var o = {
   f : function() {
      this.p();
   }
   p : function() {
      alert("run!");
   }
}

element.addEventListener("click", o.f);
//addEventListener is overrode for older IE version.

在此代码中,element具有处理对象o的方法o.f()的点击事件。 如果我像这样直接运行那个方法

o.f();

它工作正常。它会显示警告消息框,其中包含文本“run!”。

但是在IE8中,当触发click事件时,它会显示错误。 “this没有方法p。”(undefined

因为在其他浏览器和最新的IE版本中,this本身包含对象o。但旧的IE包含Window Object

我想解决这个问题。使this指向对象本身。不是window

有可能吗?

1 个答案:

答案 0 :(得分:3)

对于IE8(或实际上任何浏览器),您需要更改它:

element.addEventListener("click", o.f);

到此:

element.addEventListener("click", function(e) {
   return o.f(e);
});

当您传递o.f时,您只传递对f函数的引用。对象o的引用丢失了。因此,最终只需调用f,而无需根据需要设置this。在较新的浏览器中,您可以这样做:

element.addEventListener("click", o.f.bind(o));

但是,.bind()在IE8中不可用,所以我的第一个推荐是更多跨浏览器。仅供参考,这一切都假设您在IE8中进行.addEventListener工作(根据您的意见)。