upfront-editable
Version:
Friendly contenteditable API
110 lines (95 loc) • 2.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = eventable;
var _jquery = _interopRequireDefault(require("jquery"));
// Eventable Mixin.
//
// Simple mixin to add event emitter methods to an object (Publish/Subscribe).
//
// Add on, off and notify methods to an object:
// eventable(obj)
//
// publish an event:
// obj.notify(context, 'action', param1, param2)
//
// Optionally pass a context that will be applied to every event:
// eventable(obj, context)
//
// With this publishing can omit the context argument:
// obj.notify('action', param1, param2)
//
// Subscribe to a 'channel'
// obj.on('action', funtion(param1, param2){ ... })
//
// Unsubscribe an individual listener:
// obj.off('action', method)
//
// Unsubscribe all listeners of a channel:
// obj.off('action')
//
// Unsubscribe all listeners of all channels:
// obj.off()
function eventable(obj, notifyContext) {
_jquery["default"].extend(obj, getEventableModule(notifyContext));
}
function getEventableModule(notifyContext) {
var listeners = {};
function addListener(events, listener) {
events.split(' ').forEach(function (event) {
listeners[event] = listeners[event] || [];
listeners[event].unshift(listener);
});
}
function removeListener(event, listener) {
var eventListeners = listeners[event];
if (!eventListeners) return;
var index = eventListeners.indexOf(listener);
if (index < 0) return;
eventListeners.splice(index, 1);
} // Public Methods
return {
on: function on(event, listener) {
if (arguments.length === 2) {
addListener(event, listener);
} else if (arguments.length === 1) {
for (var eventType in event) {
addListener(eventType, event[eventType]);
}
}
return this;
},
off: function off(event, listener) {
if (arguments.length === 2) {
removeListener(event, listener);
} else if (arguments.length === 1) {
listeners[event] = [];
} else {
listeners = {};
}
},
notify: function notify(context, event) {
var args = Array.from(arguments);
if (notifyContext) {
event = context;
context = notifyContext;
args.splice(0, 1);
} else {
args.splice(0, 2);
}
if (this.switchContext) {
var nextEvent = this.switchContext.events.shift();
if (event !== nextEvent) this.switchContext = undefined;
}
var eventListeners = listeners[event];
if (!eventListeners) return; // Execute the newest listeners first.
// Stop if a listener returns false.
eventListeners.every(function (listener) {
return listener.apply(context, args) !== false;
});
}
};
}
module.exports = exports.default;