Source: eventer/Eventer.js


/* eslint prefer-rest-params: 0 */

import {Utils} from '../utils/Utils';

/**
 * jcc2d的事件对象的类
 *
 * @class
 * @memberof JC
 */
function Eventer() {
  /**
   * 事件监听列表
   *
   * @member {Object}
   * @private
   */
  this.listeners = {};
}

/**
 * 事件对象的事件绑定函数
 *
 * @param {String} type 事件类型
 * @param {Function} fn 回调函数
 * @return {this}
 */
Eventer.prototype.on = function(type, fn) {
  if (!Utils.isFunction(fn)) return;
  this.interactive = true;
  this.listeners[type] = this.listeners[type] || [];
  this.listeners[type].push(fn);
  return this;
};

/**
 * 事件对象的事件解绑函数
 *
 * @param {String} type 事件类型
 * @param {Function} fn 注册时回调函数的引用
 * @return {this}
 */
Eventer.prototype.off = function(type, fn) {
  if (Utils.isUndefined(this.listeners[type])) return;
  const cbs = this.listeners[type] || [];
  let i = cbs.length;
  if (i > 0) {
    if (fn) {
      while (i--) {
        if (cbs[i] === fn) {
          cbs.splice(i, 1);
        }
      }
    } else {
      cbs.length = 0;
    }
  }
  return this;
};

/**
 * 事件对象的一次性事件绑定函数
 *
 * @param {String} type 事件类型
 * @param {Function} fn 回调函数
 * @return {this}
 */
Eventer.prototype.once = function(type, fn) {
  if (!Utils.isFunction(fn)) return;
  const This = this;
  const cb = function(ev) {
    if (fn) fn(ev);
    This.off(type, cb);
  };
  this.on(type, cb);
  return this;
};

/**
 * 事件对象的触发事件函数
 *
 * @param {String} type 事件类型
 * @param {JC.InteractionData} ev 事件数据
 */
Eventer.prototype.emit = function(type) {
  if (Utils.isUndefined(this.listeners[type])) return;
  const cbs = this.listeners[type] || [];
  const cache = cbs.slice(0);
  const reset = [];
  for (let j = 1; j < arguments.length; j++) {
    reset.push(arguments[j]);
  }
  let i;
  for (i = 0; i < cache.length; i++) {
    cache[i].apply(this, reset);
  }
};

export {Eventer};