Я создал многоцелевую фабричную функцию генератора событий. С его помощью я могу превратить объекты в источники событий. Код для фабрики генератора событий приведен ниже, если кто-то хочет посмотреть или использовать его.
Мой вопрос: как мне получить список событий из DOM? Обратите внимание, что я не пытаюсь получить список связанных событий. Я хочу получить список всех возможных событий. Я хочу добавить метод "pipe" для эмиттеров. Этот метод будет брать объект DOM и связываться со всеми возможными событиями, а затем, когда любое из этих событий срабатывает, каждое из них вызывает событие с тем же именем в эмиттере.
Я не думаю, что есть способ сделать это. Я готов сделать жестко запрограммированный массив имен событий, но если бы я мог вместо этого получить массив для DOM, это было бы намного лучше и работало бы, если бы W3C стандартизировал больше типов событий.
P.S. Если вы работаете на W3C, это та чушь, которая заставляет всех ненавидеть DOM. Пожалуйста, перестаньте относиться к JavaScript как к игрушечному языку. Это не игрушечный язык и требует больше, чем ваш игрушечный DOM.
/**
* Creates a event emitter
*/
function EventEmitter() {
var api, callbacks;
//vars
api = {
"on": on,
"trigger": trigger
};
callbacks = {};
//return the api
return api;
/**
* Binds functions to events
* @param event
* @param callback
*/
function on(event, callback) {
var api;
if(typeof event !== 'string') { throw new Error('Cannot bind to event emitter. The passed event is not a string.'); }
if(typeof callback !== 'function') { throw new Error('Cannot bind to event emitter. The passed callback is not a function.'); }
//return the api
api = {
"clear": clear
};
//create the event namespace if it doesn't exist
if(!callbacks[event]) { callbacks[event] = []; }
//save the callback
callbacks[event].push(callback);
//return the api
return api;
function clear() {
var i;
if(callbacks[event]) {
i = callbacks[event].indexOf(callback);
callbacks[event].splice(i, 1);
if(callbacks[event].length < 1) {
delete callbacks[event];
}
return true;
}
return false;
}
}
/**
* Triggers a given event and optionally passes its handlers all additional parameters
* @param event
*/
function trigger(event ) {
var args;
if(typeof event !== 'string' && !Array.isArray(event)) { throw new Error('Cannot bind to event emitter. The passed event is not a string or an array.'); }
//get the arguments
args = Array.prototype.slice.apply(arguments).splice(1);
//handle event arrays
if(Array.isArray(event)) {
//for each event in the event array self invoke passing the arguments array
event.forEach(function(event) {
//add the event name to the begining of the arguments array
args.unshift(event);
//trigger the event
trigger.apply(this, args);
//shift off the event name
args.shift();
});
return;
}
//if the event has callbacks then execute them
if(callbacks[event]) {
//fire the callbacks
callbacks[event].forEach(function(callback) { callback.apply(this, args); });
}
}
}