c572b8245b73b8bd39c109a87b4aee9b2716f743.svn-base 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. (function (global, factory) {
  2. typeof exports === 'object' && typeof module !== 'undefined'
  3. ? factory(module)
  4. : typeof define === 'function' && define.amd
  5. ? define(['exports', function (exports) {
  6. var module = { exports: {} };
  7. factory(module);
  8. exports = module.exports;
  9. }])
  10. : (function () {
  11. var module = { exports: {} };
  12. factory(module);
  13. global.Event = module.exports;
  14. }())
  15. })(this, function (module) {
  16. /**
  17. * 判断某个函数是否由浏览器自身实现
  18. */
  19. function isNative (Ctor) {
  20. return typeof Ctor === 'function' && /native code/.test(Ctor.toString());
  21. }
  22. // 延迟回调触发器
  23. var delay;
  24. {
  25. if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
  26. delay = setImmediate;
  27. } else if (isNative(typeof Promise !== 'undefined' && Promise)) {
  28. delay = function (fn) {
  29. Promise.resolve()
  30. .then(fn)
  31. }
  32. } else {
  33. delay = function (fn) {
  34. setTimeout(fn, 0);
  35. }
  36. }
  37. }
  38. /**
  39. * 回调函数处理器,用于统一话调用回调
  40. */
  41. function fnHandle (fns) {
  42. if (!Array.isArray(fns)) {
  43. fns = [fns];
  44. }
  45. var handle = function handle() {
  46. for (var i = 0; i < fns.length; i++) {
  47. fns[i].apply(this, arguments);
  48. }
  49. }
  50. handle.fns = fns;
  51. return handle
  52. }
  53. /* ------------- */
  54. function Event () {
  55. // 事件回调存储栈
  56. this.stacks = {}
  57. }
  58. /**
  59. * 绑定事件统一处理器
  60. */
  61. Event.prototype.__bind = function __bind (name, fns) {
  62. var fn = fnHandle(fns);
  63. if (!this.stacks[name]) {
  64. this.stacks[name] = fnHandle(function() { })
  65. }
  66. this.stacks[name].fns.push(fn);
  67. return fn;
  68. }
  69. /**
  70. * 绑定事件及回调函数
  71. */
  72. Event.prototype.on = function on (name, fns) {
  73. this.__bind(name, fns);
  74. }
  75. /**
  76. * 接触绑定事件
  77. */
  78. Event.prototype.off = function on(name) {
  79. this.stacks[name] && (this.stacks[name] = fnHandle(function () { }))
  80. }
  81. /**
  82. * 单次绑定,一次触发就失效
  83. */
  84. Event.prototype.once = function once (name, fns) {
  85. var fn = this.__bind(name, fns);
  86. fn.isOnce = true;
  87. }
  88. /**
  89. * 发布事件,及如果事一次绑定的移除引用调用
  90. */
  91. Event.prototype.emit = function emit (name) {
  92. var callback = this.stacks[name];
  93. var args = Array.prototype.slice.call(arguments, 1);
  94. if (callback) {
  95. delay(function () {
  96. callback.apply(this, args);
  97. var fns = callback.fns,
  98. i = 0;
  99. while (fns[i]) {
  100. if (fns[i].isOnce) {
  101. fns.splice(i, 1);
  102. } else {
  103. i++
  104. }
  105. }
  106. })
  107. }
  108. }
  109. module.exports = Event;
  110. });