ActionScript 3 EventDispatcher 的 Javascript 实现

标签 javascript events actionscript porting listeners

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

我最近遇到的一个问题是,我附加的回调没有被正确的 this 值调用。我暂时修复它的方法是将第三个参数添加到 addEventListener 并返回上下文,但这并不理想,因为它不匹配与 actionscript 等价物相同的原型(prototype)。

我尝试的另一件事是 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);
        } 
      }
    } 
  }
});

最佳答案

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

我想说您当前的实现不仅正确,而且比您一直追求的更强大、更安全。通过传递和存储每个事件监听器的上下文,您不断提醒自己您使用的是 Javascript,而不是 actionscript,并且您避免了整个类别的陷阱,这些陷阱伴随着忽略 Javascript 的函数范围和AS3 的

关于ActionScript 3 EventDispatcher 的 Javascript 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7026709/

相关文章:

apache-flex - 使用 Adob​​e AIR 从本地文件播放视频

actionscript-3 - 在 actionscript 3 中动态创建对象?

c# - DataGridView 中的 CellClick 事件和 SelectionChanged 事件

玛根托 : Add data to quote item object in an observer

actionscript-3 - as3中的动画 "blob"

javascript - jQuery 范围 slider grep 返回具有最小值和最大值的项目

javascript - 有没有办法从服务器更新 iOS 应用程序中的 javascript 文件?

javascript - 为什么 Promise 中的方法没有括号?

javascript - 如何固定div按钮的位置

javascript - 在哪里可以找到 DOM 方法(?)(例如appendChild())的引用列表?