eventemitter.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /* Polyfill indexOf. */
  2. var indexOf;
  3. if (typeof Array.prototype.indexOf === 'function') {
  4. indexOf = function (haystack, needle) {
  5. return haystack.indexOf(needle);
  6. };
  7. } else {
  8. indexOf = function (haystack, needle) {
  9. var i = 0, length = haystack.length, idx = -1, found = false;
  10. while (i < length && !found) {
  11. if (haystack[i] === needle) {
  12. idx = i;
  13. found = true;
  14. }
  15. i++;
  16. }
  17. return idx;
  18. };
  19. };
  20. /* Polyfill EventEmitter. */
  21. var EventEmitter = function () {
  22. this.events = {};
  23. };
  24. EventEmitter.prototype.on = function (event, listener) {
  25. if (typeof this.events[event] !== 'object') {
  26. this.events[event] = [];
  27. }
  28. this.events[event].push(listener);
  29. };
  30. EventEmitter.prototype.removeListener = function (event, listener) {
  31. var idx;
  32. if (typeof this.events[event] === 'object') {
  33. idx = indexOf(this.events[event], listener);
  34. if (idx > -1) {
  35. this.events[event].splice(idx, 1);
  36. }
  37. }
  38. };
  39. EventEmitter.prototype.emit = function (event) {
  40. var i, listeners, length, args = [].slice.call(arguments, 1);
  41. if (typeof this.events[event] === 'object') {
  42. listeners = this.events[event].slice();
  43. length = listeners.length;
  44. for (i = 0; i < length; i++) {
  45. listeners[i].apply(this, args);
  46. }
  47. }
  48. };
  49. EventEmitter.prototype.once = function (event, listener) {
  50. this.on(event, function g () {
  51. this.removeListener(event, g);
  52. listener.apply(this, arguments);
  53. });
  54. };