Получение массива всех возможных событий DOM

Я создал многоцелевую фабрику фабричных генераторов событий. С его помощью я могу превращать объекты в эмиттеры событий. Ниже приведен код фабрики эмиттеров событий, если кто-то захочет его посмотреть или использовать.

У меня вопрос, как мне получить список событий из DOM. Обратите внимание, я не пытаюсь получить список связанных событий. Мне нужен список всех возможных событий. Я хочу добавить к эмиттерам метод "трубы". Этот метод будет принимать объект DOM и связываться со всеми возможными событиями, а затем, когда любое из этих событий срабатывает, каждое из них запускает событие с тем же именем в эмиттере.

Я не думаю, что есть способ сделать это. Я готов создать жестко закодированный массив имен событий, но если бы я мог получить вместо этого массив для DOM, это было бы намного лучше и все равно работало бы, если W3C стандартизирует больше типов событий.

P.S. Если вы работаете на W3C, это та чушь, из-за которой все ненавидят DOM. Пожалуйста, перестаньте относиться к JavaScript как к игрушечному языку. Это не игрушечный язык, и он требует большего, чем ваш игрушечный ДОМ.

/**
 * 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); });
        }
    }
}
9
задан Robert Hurst 20 February 2012 в 23:36
поделиться