Eventful.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. /**
  2. * 事件扩展
  3. * @module zrender/mixin/Eventful
  4. * @author Kener (@Kener-林峰, kener.linfeng@gmail.com)
  5. * pissang (https://www.github.com/pissang)
  6. */
  7. var arrySlice = Array.prototype.slice;
  8. /**
  9. * 事件分发器
  10. * @alias module:zrender/mixin/Eventful
  11. * @constructor
  12. */
  13. var Eventful = function () {
  14. this._$handlers = {};
  15. };
  16. Eventful.prototype = {
  17. constructor: Eventful,
  18. /**
  19. * 单次触发绑定,trigger后销毁
  20. *
  21. * @param {string} event 事件名
  22. * @param {Function} handler 响应函数
  23. * @param {Object} context
  24. */
  25. one: function (event, handler, context) {
  26. var _h = this._$handlers;
  27. if (!handler || !event) {
  28. return this;
  29. }
  30. if (!_h[event]) {
  31. _h[event] = [];
  32. }
  33. for (var i = 0; i < _h[event].length; i++) {
  34. if (_h[event][i].h === handler) {
  35. return this;
  36. }
  37. }
  38. _h[event].push({
  39. h: handler,
  40. one: true,
  41. ctx: context || this
  42. });
  43. return this;
  44. },
  45. /**
  46. * 绑定事件
  47. * @param {string} event 事件名
  48. * @param {Function} handler 事件处理函数
  49. * @param {Object} [context]
  50. */
  51. on: function (event, handler, context) {
  52. var _h = this._$handlers;
  53. if (!handler || !event) {
  54. return this;
  55. }
  56. if (!_h[event]) {
  57. _h[event] = [];
  58. }
  59. for (var i = 0; i < _h[event].length; i++) {
  60. if (_h[event][i].h === handler) {
  61. return this;
  62. }
  63. }
  64. _h[event].push({
  65. h: handler,
  66. one: false,
  67. ctx: context || this
  68. });
  69. return this;
  70. },
  71. /**
  72. * 是否绑定了事件
  73. * @param {string} event
  74. * @return {boolean}
  75. */
  76. isSilent: function (event) {
  77. var _h = this._$handlers;
  78. return _h[event] && _h[event].length;
  79. },
  80. /**
  81. * 解绑事件
  82. * @param {string} event 事件名
  83. * @param {Function} [handler] 事件处理函数
  84. */
  85. off: function (event, handler) {
  86. var _h = this._$handlers;
  87. if (!event) {
  88. this._$handlers = {};
  89. return this;
  90. }
  91. if (handler) {
  92. if (_h[event]) {
  93. var newList = [];
  94. for (var i = 0, l = _h[event].length; i < l; i++) {
  95. if (_h[event][i]['h'] != handler) {
  96. newList.push(_h[event][i]);
  97. }
  98. }
  99. _h[event] = newList;
  100. }
  101. if (_h[event] && _h[event].length === 0) {
  102. delete _h[event];
  103. }
  104. } else {
  105. delete _h[event];
  106. }
  107. return this;
  108. },
  109. /**
  110. * 事件分发
  111. *
  112. * @param {string} type 事件类型
  113. */
  114. trigger: function (type) {
  115. if (this._$handlers[type]) {
  116. var args = arguments;
  117. var argLen = args.length;
  118. if (argLen > 3) {
  119. args = arrySlice.call(args, 1);
  120. }
  121. var _h = this._$handlers[type];
  122. var len = _h.length;
  123. for (var i = 0; i < len;) {
  124. // Optimize advise from backbone
  125. switch (argLen) {
  126. case 1:
  127. _h[i]['h'].call(_h[i]['ctx']);
  128. break;
  129. case 2:
  130. _h[i]['h'].call(_h[i]['ctx'], args[1]);
  131. break;
  132. case 3:
  133. _h[i]['h'].call(_h[i]['ctx'], args[1], args[2]);
  134. break;
  135. default:
  136. // have more than 2 given arguments
  137. _h[i]['h'].apply(_h[i]['ctx'], args);
  138. break;
  139. }
  140. if (_h[i]['one']) {
  141. _h.splice(i, 1);
  142. len--;
  143. } else {
  144. i++;
  145. }
  146. }
  147. }
  148. return this;
  149. },
  150. /**
  151. * 带有context的事件分发, 最后一个参数是事件回调的context
  152. * @param {string} type 事件类型
  153. */
  154. triggerWithContext: function (type) {
  155. if (this._$handlers[type]) {
  156. var args = arguments;
  157. var argLen = args.length;
  158. if (argLen > 4) {
  159. args = arrySlice.call(args, 1, args.length - 1);
  160. }
  161. var ctx = args[args.length - 1];
  162. var _h = this._$handlers[type];
  163. var len = _h.length;
  164. for (var i = 0; i < len;) {
  165. // Optimize advise from backbone
  166. switch (argLen) {
  167. case 1:
  168. _h[i]['h'].call(ctx);
  169. break;
  170. case 2:
  171. _h[i]['h'].call(ctx, args[1]);
  172. break;
  173. case 3:
  174. _h[i]['h'].call(ctx, args[1], args[2]);
  175. break;
  176. default:
  177. // have more than 2 given arguments
  178. _h[i]['h'].apply(ctx, args);
  179. break;
  180. }
  181. if (_h[i]['one']) {
  182. _h.splice(i, 1);
  183. len--;
  184. } else {
  185. i++;
  186. }
  187. }
  188. }
  189. return this;
  190. }
  191. }; // 对象可以通过 onxxxx 绑定事件
  192. /**
  193. * @event module:zrender/mixin/Eventful#onclick
  194. * @type {Function}
  195. * @default null
  196. */
  197. /**
  198. * @event module:zrender/mixin/Eventful#onmouseover
  199. * @type {Function}
  200. * @default null
  201. */
  202. /**
  203. * @event module:zrender/mixin/Eventful#onmouseout
  204. * @type {Function}
  205. * @default null
  206. */
  207. /**
  208. * @event module:zrender/mixin/Eventful#onmousemove
  209. * @type {Function}
  210. * @default null
  211. */
  212. /**
  213. * @event module:zrender/mixin/Eventful#onmousewheel
  214. * @type {Function}
  215. * @default null
  216. */
  217. /**
  218. * @event module:zrender/mixin/Eventful#onmousedown
  219. * @type {Function}
  220. * @default null
  221. */
  222. /**
  223. * @event module:zrender/mixin/Eventful#onmouseup
  224. * @type {Function}
  225. * @default null
  226. */
  227. /**
  228. * @event module:zrender/mixin/Eventful#ondrag
  229. * @type {Function}
  230. * @default null
  231. */
  232. /**
  233. * @event module:zrender/mixin/Eventful#ondragstart
  234. * @type {Function}
  235. * @default null
  236. */
  237. /**
  238. * @event module:zrender/mixin/Eventful#ondragend
  239. * @type {Function}
  240. * @default null
  241. */
  242. /**
  243. * @event module:zrender/mixin/Eventful#ondragenter
  244. * @type {Function}
  245. * @default null
  246. */
  247. /**
  248. * @event module:zrender/mixin/Eventful#ondragleave
  249. * @type {Function}
  250. * @default null
  251. */
  252. /**
  253. * @event module:zrender/mixin/Eventful#ondragover
  254. * @type {Function}
  255. * @default null
  256. */
  257. /**
  258. * @event module:zrender/mixin/Eventful#ondrop
  259. * @type {Function}
  260. * @default null
  261. */
  262. var _default = Eventful;
  263. module.exports = _default;