'::hui_eventdispatcher::';
'use strict';
// __ __ ______ ______ _____ __ __
// /\ \ /\ \ /'\_/`\ /\ _ \ /\__ _\/\ __`\ /\ \/\ \
// \ `\`\\/'//\ \\ \ \/\ \\/_/\ \/\ \ \/\ \\ \ \ \ \
// `\ `\ /' \ \ \__\ \\ \ __ \ \ \ \ \ \ \ \ \\ \ \ \ \
// `\ \ \ \ \ \_/\ \\ \ \/\ \ \ \ \ \ \ \_\ \\ \ \_\ \
// \ \_\ \ \_\\ \_\\ \_\ \_\ \ \_\ \ \_____\\ \_____\
// \/_/ \/_/ \/_/ \/_/\/_/ \/_/ \/_____/ \/_____/
//
/**
* @class hui.EventDispatcher
* @description 基础事件派发类
* @public
* @author wanghaiyang
* @date 2015/09/14
*/
hui.define('hui_eventdispatcher', [], function () {
hui.EventDispatcher = function () {
this._listeners = {};
};
hui.EventDispatcher.prototype = {
/**
* @method on
* @description 添加监听器
* @public
* @param {String} eventType 事件类型.
* @param {Function} listener 监听器.
*/
on: function (eventType, listener) {
if (!this._listeners[eventType]) {
this._listeners[eventType] = [];
}
var list = this._listeners[eventType],
exist = false,
index;
for (var i = 0, len = list.length; i < len; i++) {
if (list[i] === listener) {
exist = true;
index = i;
break;
}
}
if (!exist) {
this._listeners[eventType].push(listener);
index = this._listeners[eventType].length - 1;
}
return index;
},
/**
* @method one
* @description 添加一次性监听器
* @public
* @param {String} eventType 事件类型.
* @param {Function} listener 监听器.
*/
one: function (eventType, listener) {
function handler() {
YmtApi.off(eventType, index);
var args = [];
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
listener.apply(YmtApi, args);
}
var index = YmtApi.on(eventType, handler);
return index;
},
/**
* @method off
* @description 移除监听器
* @public
* @param {String} eventType 事件类型.
* @param {Function} listener 监听器.
*/
off: function (eventType, listener) {
if (!this._listeners[eventType]) {
return;
}
var list = this._listeners[eventType];
for (var i = 0, len = list.length; i < len; i++) {
if (list[i] === listener || i === listener) {
this._listeners[eventType][i] = undefined;
break;
}
}
if (listener === undefined) {
this._listeners[eventType] = [];
}
},
/**
* @method clear
* @description 清除所有监听器
* @public
*/
clear: function (eventType) {
// 清除全部
if (!eventType) {
this._listeners = [];
}
// 只清除指定类型
else if (this._listeners[eventType]) {
this._listeners[eventType] = [];
}
else if (Object.prototype.toString.call(eventType) === '[object Array]') {
for (var i = 0, len = eventType.length; i < len; i++) {
this.clear(eventType[i]);
}
}
},
/**
* @method trigger
* @description 触发事件
* @public
* @param {String} eventType 事件类型.
*/
trigger: function (eventType) {
if (!this._listeners[eventType]) {
return;
}
var args = [];
for (var i = 1; i < arguments.length; i++) {
args.push(arguments[i]);
}
var list = this._listeners[eventType];
for (var i = 0, len = list.length; i < len; i++) {
if (list[i]) {
list[i].apply(this, args);
}
}
}
};
hui.EventDispatcher.prototype.constructor = hui.EventDispatcher;
});