328 lines
5.9 KiB
JavaScript
328 lines
5.9 KiB
JavaScript
/**
|
||
* 事件扩展
|
||
* @module zrender/mixin/Eventful
|
||
* @author Kener (@Kener-林峰, kener.linfeng@gmail.com)
|
||
* pissang (https://www.github.com/pissang)
|
||
*/
|
||
var arrySlice = Array.prototype.slice;
|
||
/**
|
||
* 事件分发器
|
||
* @alias module:zrender/mixin/Eventful
|
||
* @constructor
|
||
*/
|
||
|
||
var Eventful = function () {
|
||
this._$handlers = {};
|
||
};
|
||
|
||
Eventful.prototype = {
|
||
constructor: Eventful,
|
||
|
||
/**
|
||
* 单次触发绑定,trigger后销毁
|
||
*
|
||
* @param {string} event 事件名
|
||
* @param {Function} handler 响应函数
|
||
* @param {Object} context
|
||
*/
|
||
one: function (event, handler, context) {
|
||
var _h = this._$handlers;
|
||
|
||
if (!handler || !event) {
|
||
return this;
|
||
}
|
||
|
||
if (!_h[event]) {
|
||
_h[event] = [];
|
||
}
|
||
|
||
for (var i = 0; i < _h[event].length; i++) {
|
||
if (_h[event][i].h === handler) {
|
||
return this;
|
||
}
|
||
}
|
||
|
||
_h[event].push({
|
||
h: handler,
|
||
one: true,
|
||
ctx: context || this
|
||
});
|
||
|
||
return this;
|
||
},
|
||
|
||
/**
|
||
* 绑定事件
|
||
* @param {string} event 事件名
|
||
* @param {Function} handler 事件处理函数
|
||
* @param {Object} [context]
|
||
*/
|
||
on: function (event, handler, context) {
|
||
var _h = this._$handlers;
|
||
|
||
if (!handler || !event) {
|
||
return this;
|
||
}
|
||
|
||
if (!_h[event]) {
|
||
_h[event] = [];
|
||
}
|
||
|
||
for (var i = 0; i < _h[event].length; i++) {
|
||
if (_h[event][i].h === handler) {
|
||
return this;
|
||
}
|
||
}
|
||
|
||
_h[event].push({
|
||
h: handler,
|
||
one: false,
|
||
ctx: context || this
|
||
});
|
||
|
||
return this;
|
||
},
|
||
|
||
/**
|
||
* 是否绑定了事件
|
||
* @param {string} event
|
||
* @return {boolean}
|
||
*/
|
||
isSilent: function (event) {
|
||
var _h = this._$handlers;
|
||
return _h[event] && _h[event].length;
|
||
},
|
||
|
||
/**
|
||
* 解绑事件
|
||
* @param {string} event 事件名
|
||
* @param {Function} [handler] 事件处理函数
|
||
*/
|
||
off: function (event, handler) {
|
||
var _h = this._$handlers;
|
||
|
||
if (!event) {
|
||
this._$handlers = {};
|
||
return this;
|
||
}
|
||
|
||
if (handler) {
|
||
if (_h[event]) {
|
||
var newList = [];
|
||
|
||
for (var i = 0, l = _h[event].length; i < l; i++) {
|
||
if (_h[event][i]['h'] != handler) {
|
||
newList.push(_h[event][i]);
|
||
}
|
||
}
|
||
|
||
_h[event] = newList;
|
||
}
|
||
|
||
if (_h[event] && _h[event].length === 0) {
|
||
delete _h[event];
|
||
}
|
||
} else {
|
||
delete _h[event];
|
||
}
|
||
|
||
return this;
|
||
},
|
||
|
||
/**
|
||
* 事件分发
|
||
*
|
||
* @param {string} type 事件类型
|
||
*/
|
||
trigger: function (type) {
|
||
if (this._$handlers[type]) {
|
||
var args = arguments;
|
||
var argLen = args.length;
|
||
|
||
if (argLen > 3) {
|
||
args = arrySlice.call(args, 1);
|
||
}
|
||
|
||
var _h = this._$handlers[type];
|
||
var len = _h.length;
|
||
|
||
for (var i = 0; i < len;) {
|
||
// Optimize advise from backbone
|
||
switch (argLen) {
|
||
case 1:
|
||
_h[i]['h'].call(_h[i]['ctx']);
|
||
|
||
break;
|
||
|
||
case 2:
|
||
_h[i]['h'].call(_h[i]['ctx'], args[1]);
|
||
|
||
break;
|
||
|
||
case 3:
|
||
_h[i]['h'].call(_h[i]['ctx'], args[1], args[2]);
|
||
|
||
break;
|
||
|
||
default:
|
||
// have more than 2 given arguments
|
||
_h[i]['h'].apply(_h[i]['ctx'], args);
|
||
|
||
break;
|
||
}
|
||
|
||
if (_h[i]['one']) {
|
||
_h.splice(i, 1);
|
||
|
||
len--;
|
||
} else {
|
||
i++;
|
||
}
|
||
}
|
||
}
|
||
|
||
return this;
|
||
},
|
||
|
||
/**
|
||
* 带有context的事件分发, 最后一个参数是事件回调的context
|
||
* @param {string} type 事件类型
|
||
*/
|
||
triggerWithContext: function (type) {
|
||
if (this._$handlers[type]) {
|
||
var args = arguments;
|
||
var argLen = args.length;
|
||
|
||
if (argLen > 4) {
|
||
args = arrySlice.call(args, 1, args.length - 1);
|
||
}
|
||
|
||
var ctx = args[args.length - 1];
|
||
var _h = this._$handlers[type];
|
||
var len = _h.length;
|
||
|
||
for (var i = 0; i < len;) {
|
||
// Optimize advise from backbone
|
||
switch (argLen) {
|
||
case 1:
|
||
_h[i]['h'].call(ctx);
|
||
|
||
break;
|
||
|
||
case 2:
|
||
_h[i]['h'].call(ctx, args[1]);
|
||
|
||
break;
|
||
|
||
case 3:
|
||
_h[i]['h'].call(ctx, args[1], args[2]);
|
||
|
||
break;
|
||
|
||
default:
|
||
// have more than 2 given arguments
|
||
_h[i]['h'].apply(ctx, args);
|
||
|
||
break;
|
||
}
|
||
|
||
if (_h[i]['one']) {
|
||
_h.splice(i, 1);
|
||
|
||
len--;
|
||
} else {
|
||
i++;
|
||
}
|
||
}
|
||
}
|
||
|
||
return this;
|
||
}
|
||
}; // 对象可以通过 onxxxx 绑定事件
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#onclick
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#onmouseover
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#onmouseout
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#onmousemove
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#onmousewheel
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#onmousedown
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#onmouseup
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#ondrag
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#ondragstart
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#ondragend
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#ondragenter
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#ondragleave
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#ondragover
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
/**
|
||
* @event module:zrender/mixin/Eventful#ondrop
|
||
* @type {Function}
|
||
* @default null
|
||
*/
|
||
|
||
var _default = Eventful;
|
||
module.exports = _default; |