interactjs
Version:
Drag and drop, resizing and multi-touch gestures with inertia and snapping for modern browsers (and also IE8+)
63 lines (50 loc) • 1.47 kB
JavaScript
const { indexOf } = require('./utils/arr');
const extend = require('./utils/extend.js');
function fireUntilImmediateStopped (event, listeners) {
for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {
listeners[i](event);
}
}
class Eventable {
constructor (options) {
this.options = extend({}, options || {});
}
fire (event) {
let listeners;
const onEvent = 'on' + event.type;
const global = this.global;
// Interactable#on() listeners
if ((listeners = this[event.type])) {
fireUntilImmediateStopped(event, listeners);
}
// interactable.onevent listener
if (this[onEvent]) {
this[onEvent](event);
}
// interact.on() listeners
if (!event.propagationStopped && global && (listeners = global[event.type])) {
fireUntilImmediateStopped(event, listeners);
}
}
on (eventType, listener) {
// if this type of event was never bound
if (this[eventType]) {
this[eventType].push(listener);
}
else {
this[eventType] = [listener];
}
}
off (eventType, listener) {
// if it is an action event type
const eventList = this[eventType];
const index = eventList? indexOf(eventList, listener) : -1;
if (index !== -1) {
eventList.splice(index, 1);
}
if (eventList && eventList.length === 0 || !listener) {
this[eventType] = listener;
}
}
}
module.exports = Eventable;