addEventListener及其范围

时间:2009-11-26 11:40:04

标签: javascript this

我有第三方Flash对象,我可以通过他们提供的JavaScript API进行操作。我试着在这个对象上听一个事件,然后在我的对象中触发事件来进一步冒泡事件。我碰巧使用的是EXT Js,但我认为它不重要。

示例代码

this.chart.addEventListener('create', function() {
    this.fireEvent('created');
}, false)

我的问题是匿名函数中的'this'是指触发事件的对象,而不是我要触发事件的对象。

它的另一个范围问题。提前感谢您的帮助。

3 个答案:

答案 0 :(得分:13)

在引用“this”对象之前创建外部变量怎么样? 例如:

var _this = this;
this.chart.addEventListener('create', function() { _this.fireEvent('created'); }, false)

答案 1 :(得分:5)

虽然其他答案可以实现您所需要的,但它们不能以最有效(可扩展)的方式工作,因为它们最终不会将视图对象(this.chart)与该视图的逻辑({{ 1}})。在MVC应用程序中,这些视图“决策”驻留在控制器中。控制器“控制”视图,并且应包含视图可以访问的所有API。

在您的示例中,fireEvent()是控制器,这很好(这意味着您将听众添加到正确的位置)。您真正需要做的就是将处理程序绑定到应该执行“处理”的事物的范围 - 在您的情况下:this

this

此页面上的其他答案已完成,因此您的视图将成为其自己的控制器,但仅在处理“创建”事件时,通过使用// `this` is the controller of `chart` this.chart.addEventListener('create', function() { this.fireEvent('created'); }.bind(this)); 为“控制器”分配临时引用。同样,这很好用,但它在事件驱动的应用程序中不能很好地工作,如果你有很多事件要处理它就没有意义。

var self = this是一个ECMAScript 5实现。如果它需要在更旧的浏览器中工作,这里描述了一个很好的方法(使用.bind()functions):https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind

答案 2 :(得分:1)

这是解决此问题的典型方法: -

(function(self) {
  self.chart.addEventListener('create', function() {self.fireEvent('created');}, false);
})(this);