title: Getting an array of all DOM events possible
body: <p>I've created a multi purpose factory event emitter factory function. With it I can turn objects into event emitters. The code for the event emitter factory is below if anyone would like to have a look or use it.</p>
  <p>My question is how can I get a list of events from the DOM. <strong>Please note I'm not trying to get a list of bound events. I want a list of all events possible.</strong> I want to add a &quot;pipe&quot; method to emitters. This method would take a DOM object and bind to all possible events, then when any of those events fire each would trigger an event of the same name in the emitter.</p>
  <p>I don't imagine there is a way to do this. I'm prepared to make a hard coded array of event names, but if I can get the array for the DOM instead that would be much better and would still work if the W3C standardizes more event types.</p>
  <p>P.S. If you work for the W3C this is the kind of crap that makes everyone hate the DOM. Please stop treating JavaScript like a toy language. It is not a toy language and needs more than your toy DOM.</p>
  <pre><code>/**
   * Creates a event emitter
   */
  function EventEmitter() {
      var api, callbacks;
  
      //vars
      api = {
          &quot;on&quot;: on,
          &quot;trigger&quot;: 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 = {
              &quot;clear&quot;: 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 &lt; 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' &amp;&amp; !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); });
          }
      }
  }
  </code></pre>