Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;(function(window) {
- 'use strict';
- function Observer() {
- this._listeners = {};
- if (arguments.length) {
- this.on.apply(this, arguments);
- }
- }
- Observer.prototype = {
- on: function(name, handler, isOnce) {
- var handlers = this._listeners[name],
- that = this,
- isAlreadyOn = false,
- handlerItem = {
- handler: handler,
- isOnce: !!isOnce
- };
- if (handlers) {
- isAlreadyOn = handlers.some(function(item) {
- return item.handler === handlerItem.handle;
- });
- !isAlreadyOn && handlers.push(handlerItem);
- } else{
- this._listeners[name] = [handlerItem];
- }
- },
- one: function(name, handler) {
- var args = [].slice.call(arguments);
- args.push(true);
- this.on.apply(this, args);
- },
- off: function(name, handler) {
- var handlers = this._listeners[name],
- that = this,
- index;
- if (!handlers) return;
- if (handler) {
- index = handlers.findIndex(function(item) {
- return item.handler === handler;
- });
- if (index > -1) {
- handlers.splice(index, 1);
- handlers.length === 0 && deleteListener();
- }
- } else {
- deleteListener();
- }
- function deleteListener() {
- delete that._listeners[name];
- }
- },
- fire: function(name, data) {
- var handlers = this._listeners[name],
- that = this;
- if (handlers) {
- handlers.forEach(function(item) {
- item.handler.call(this, {
- type: name,
- data: data
- });
- if (item.isOnce) {
- that.off(name, item.handler);
- }
- });
- }
- }
- };
- Observer._listeners = {};
- for (var key in Observer.prototype) {
- Observer[key] = Observer.prototype[key];
- }
- window.Observer = Observer;
- })(window);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement