【问题标题】:Javascript dispatchEventJavascript调度事件
【发布时间】:2010-02-13 00:00:27
【问题描述】:

我经常使用 Flash,我的类使用 EventDispatcher 类,它允许我定义类的自定义事件。如何在 JavaScript 中做到这一点。

我想做这样的事情:

var MyClass = function() {
};
MyClass.prototype = {
  test : function() {
    dispatchEvent('ON_TEST');
  }
};

var mc = new MyClass();
mc.addEventListener('ON_TEST', handler);
function handler() { alert('working...') }

用 JavaScript 怎么可能?

【问题讨论】:

    标签: javascript dom-events dispatcher


    【解决方案1】:

    必须自己动手。这只是一种方法。

    var MyClass = function() {
        this._events = {};
    };
    MyClass.prototype = {
      addListener: function(eventName, callback) {
          var events = this._events,
              callbacks = events[eventName] = events[eventName] || [];
          callbacks.push(callback);
      },
      raiseEvent: function(eventName, args) {
          var callbacks = this._events[eventName];
          for (var i = 0, l = callbacks.length; i < l; i++) {
              callbacks[i].apply(null, args);
          }
      },
      test : function() {
        this.raiseEvent('ON_TEST', [1,2,3]); // whatever args to pass to listeners
      }
    };
    

    您可能还应该添加一个“removeListener”,它必须在数组中找到回调并将其从数组中删除(或者如果没有给出回调,则可能删除整个事件的所有侦听器)。

    【讨论】:

    • 这很棒,毕竟这些年来仍然是一个很好的解决方案:)
    • 快速问题,在 addListener 内部,为什么所有变量?你能不做function (eventName, callback) { (this._events[eventName] = this._events[eventName] || []).push(callback); },吗?还是仅仅是可读性的问题?
    • 可读性,当然,为什么偏爱聪明?而且,从技术上讲,您在那里访问了 this._events 两次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多