ActionScript 3 EventDispatcher的Javascript实现

时间:2011-08-11 13:28:03

标签: javascript events actionscript porting listeners

我正在将一个ActionScript应用程序移植到JavaScript,我正在尝试完善我的EventDispatcher实现。

我最近遇到的一个问题是我附加的回调没有使用正确的this值进行调用。我暂时修复它的方法是向addEventListener添加第三个参数并返回上下文,但这并不理想,因为它与动作脚本相同的原型不匹配。

我尝试的另一件事是this.callback风格的函数,但这有更多的问题,尤其是removeEventListener

有没有办法在Javascript中遵循ActionScript的事件样式?

我当前的实现如下:(取决于jQuery / jQueryMX)

var EventDispatcher = jQuery.Class.extend({
  listeners: {},
  init: function() {
    this.listeners = {};
  },
  addEventListener: function(event, listener, context) {
    if (this.listeners.hasOwnProperty(event)) {
      this.listeners[event].push([listener,context]);
    } else {
      this.listeners[event] = [[listener,context]];
    }
  }, 
  hasEventListener: function() {
    console.error('hasEventListener unimplemented', arguments);
  },
  removeEventListener: function(event, listener) {
    if (this.listeners.hasOwnProperty(event)) {
      for (i in this.listeners[event]) {
        if (this.listeners[event][i][0] == listener) {
          this.listeners[event].splice(i,1);
          return true;
        }
      }
    } else {
      //console.log('no listener found for',event,listener,this);
      return false;
    }
  },
  dispatchEvent: function(event) {
    if (event.type && this.listeners.hasOwnProperty(event.type)) {    
      event.currentTarget = this;
      //console.log('dispatchEvent',event,this);
      for (i in this.listeners[event.type]) {
        if (typeof this.listeners[event.type][i][0] == 'function') {
          this.listeners[event.type][i][0].call(this.listeners[event.type][i][1],event);
        } 
      }
    } 
  }
});

2 个答案:

答案 0 :(得分:2)

Actionscript 3和Javascript是根本不同的语言。您可以在addEventListener函数中使用arguments.callee并获得AS3 EventDispatcher接口的某种近似值,但考虑到两种语言之间的固有差异,不可能(或希望)完全匹配它。我们在AS3中通常使用EventDispatcher的方式依赖于Bound Method的概念,它在Javascript中根本不存在。

我会说你当前的实现不仅正确,而且比你拍摄的更强大,更安全。通过传递和存储每个事件监听器的上下文,你不断提醒自己,你使用的是Javascript,而不是动作脚本,并且你避免了一整套陷阱,忽略了Javascript的功能范围和AS3的

答案 1 :(得分:1)

在AS2中回想一下您可能派上派生实用程序类的地方。