我有第三方Flash对象,我可以通过他们提供的JavaScript API进行操作。我试着在这个对象上听一个事件,然后在我的对象中触发事件来进一步冒泡事件。我碰巧使用的是EXT Js,但我认为它不重要。
示例代码
this.chart.addEventListener('create', function() {
this.fireEvent('created');
}, false)
我的问题是匿名函数中的'this'是指触发事件的对象,而不是我要触发事件的对象。
它的另一个范围问题。提前感谢您的帮助。
答案 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);