mirror of
https://github.com/codex-team/editor.js
synced 2024-05-11 10:57:30 +02:00
192 lines
3.9 KiB
JavaScript
192 lines
3.9 KiB
JavaScript
|
/**
|
||
|
* Codex Editor Listeners module
|
||
|
*
|
||
|
* @author Codex Team
|
||
|
* @version 1.0
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Module-decorator for event listeners assignment
|
||
|
*/
|
||
|
module.exports = function (listeners) {
|
||
|
|
||
|
var allListeners = [];
|
||
|
|
||
|
/**
|
||
|
* Search methods
|
||
|
*
|
||
|
* byElement, byType and byHandler returns array of suitable listeners
|
||
|
* one and all takes element, eventType, and handler and returns first (all) suitable listener
|
||
|
*
|
||
|
*/
|
||
|
listeners.search = function () {
|
||
|
|
||
|
var byElement = function (element, context) {
|
||
|
|
||
|
var listenersOnElement = [];
|
||
|
|
||
|
context = context || allListeners;
|
||
|
|
||
|
for (var i = 0; i < context.length; i++) {
|
||
|
|
||
|
var listener = context[i];
|
||
|
|
||
|
if (listener.element === element) {
|
||
|
|
||
|
listenersOnElement.push(listener);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return listenersOnElement;
|
||
|
|
||
|
};
|
||
|
|
||
|
var byType = function (eventType, context) {
|
||
|
|
||
|
var listenersWithType = [];
|
||
|
|
||
|
context = context || allListeners;
|
||
|
|
||
|
for (var i = 0; i < context.length; i++) {
|
||
|
|
||
|
var listener = context[i];
|
||
|
|
||
|
if (listener.type === eventType) {
|
||
|
|
||
|
listenersWithType.push(listener);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return listenersWithType;
|
||
|
|
||
|
};
|
||
|
|
||
|
var byHandler = function (handler, context) {
|
||
|
|
||
|
var listenersWithHandler = [];
|
||
|
|
||
|
context = context || allListeners;
|
||
|
|
||
|
for (var i = 0; i < context.length; i++) {
|
||
|
|
||
|
var listener = context[i];
|
||
|
|
||
|
if (listener.handler === handler) {
|
||
|
|
||
|
listenersWithHandler.push(listener);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return listenersWithHandler;
|
||
|
|
||
|
};
|
||
|
|
||
|
var one = function (element, eventType, handler) {
|
||
|
|
||
|
var result = allListeners;
|
||
|
|
||
|
if (element)
|
||
|
result = byElement(element, result);
|
||
|
|
||
|
if (eventType)
|
||
|
result = byType(eventType, result);
|
||
|
|
||
|
if (handler)
|
||
|
result = byHandler(handler, result);
|
||
|
|
||
|
return result[0];
|
||
|
|
||
|
};
|
||
|
|
||
|
var all = function (element, eventType, handler) {
|
||
|
|
||
|
var result = allListeners;
|
||
|
|
||
|
if (element)
|
||
|
result = byElement(element, result);
|
||
|
|
||
|
if (eventType)
|
||
|
result = byType(eventType, result);
|
||
|
|
||
|
if (handler)
|
||
|
result = byHandler(handler, result);
|
||
|
|
||
|
return result;
|
||
|
|
||
|
};
|
||
|
|
||
|
return {
|
||
|
byElement : byElement,
|
||
|
byType : byType,
|
||
|
byHandler : byHandler,
|
||
|
one : one,
|
||
|
all : all
|
||
|
};
|
||
|
|
||
|
}();
|
||
|
|
||
|
listeners.add = function (element, eventType, handler, isCapture) {
|
||
|
|
||
|
element.addEventListener(eventType, handler, isCapture);
|
||
|
|
||
|
var data = {
|
||
|
element: element,
|
||
|
type: eventType,
|
||
|
handler: handler
|
||
|
};
|
||
|
|
||
|
var alreadyAddedListener = listeners.search.one(element, eventType, handler);
|
||
|
|
||
|
if (!alreadyAddedListener) {
|
||
|
|
||
|
allListeners.push(data);
|
||
|
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
listeners.remove = function (element, eventType, handler) {
|
||
|
|
||
|
element.removeEventListener(eventType, handler);
|
||
|
|
||
|
var existingListeners = listeners.search.all(element, eventType, handler);
|
||
|
|
||
|
for (var i = 0; i < existingListeners.length; i++) {
|
||
|
|
||
|
var index = allListeners.indexOf(existingListeners[i]);
|
||
|
|
||
|
if (index > 0) {
|
||
|
|
||
|
allListeners.splice(index, 1);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
listeners.removeAll = function () {
|
||
|
|
||
|
allListeners.map(function (current) {
|
||
|
|
||
|
listeners.remove(current.element, current.type, current.handler);
|
||
|
|
||
|
});
|
||
|
|
||
|
};
|
||
|
|
||
|
listeners.get = function (element, eventType, handler) {
|
||
|
|
||
|
return listeners.search.all(element, eventType, handler);
|
||
|
|
||
|
};
|
||
|
|
||
|
return listeners;
|
||
|
|
||
|
}({});
|