blob: fcc2df5aca67b5d8330e7a8f833eb14b8ba2bd67 [file] [log] [blame]
/**
* @file 事件
* 主要来自大佛chris(wfsr@foxmail.com)的moye
*/
define(function (require) {
var $ = require('jquery');
var isFunction = $.isFunction;
var inArray = $.inArray;
/**
* 使给定对象有事件能力
*
* @public
* @param {Object} obj 需要加事件能力的对象
* @return {Object} 有事件能力的原对象
*/
function enableEvent(obj) {
return $.extend(obj, eventMethods);
}
var eventMethods = {
/**
* 添加事件绑定。用法:
* xx.addEventListener('someType', someListener)
* xx.addEventListener(someListener) // 表示type为'*'
*
* @public
* @param {string=} type 事件类型。
* 如果为'*',表示所有事件都会触发此listener。
* @param {Function} listener 要添加绑定的监听器
*/
addEventListener: function (type, listener) {
if (isFunction(type)) {
listener = type;
type = '*';
}
this.__listeners = this.__listeners || {};
var listeners = this.__listeners[type]
|| (this.__listeners[type] = []);
if (inArray(listeners, listener) < 0) {
listeners.push(listener);
}
return this;
},
/**
* 解除事件绑定。用法:
* xx.removeEventListener('someType', someListener)
* xx.removeEventListener(someListener) // 表示type为'*'
*
* @public
* @param {string=} type 事件类型
* @param {Function} listener 要解除绑定的监听器
*/
removeEventListener: function (type, listener) {
if (isFunction(type)) {
listener = type;
type = '*';
}
this.__listeners = this.__listeners || {};
var listeners = this.__listeners[type];
if (listeners) {
if (listener) {
var index = inArray(listeners, listener);
if (~index) {
delete listeners[index];
}
}
else {
listeners.length = 0;
delete this.__listeners[type];
}
}
return this;
},
/**
* 解除所有事件绑定
*
* @public
*/
removeAllEventListener: function () {
this.__listeners = [];
return this;
},
/**
* 触发指定事件
*
* @public
* @param {string} type 事件类型
* @param {Object} args 透传的事件数据对象
*/
fire: function (type, args) {
this.__listeners = this.__listeners || {};
var listeners = this.__listeners[type];
var me = this;
if (listeners) {
$.each(listeners, function (idx, listener) {
args = args || {};
args.type = type;
listener.call(me, args);
});
}
if (type !== '*') {
this.fire('*', args);
}
return this;
}
};
return {enableEvent: enableEvent};
});