docs: function (eventType, listener, useCapture) {
              var i;
  
              if (isString(eventType) && eventType.search(' ') !== -1) {
                  eventType = eventType.trim().split(/ +/);
              }
  
              if (isArray(eventType)) {
                  for (i = 0; i < eventType.length; i++) {
                      this.on(eventType[i], listener, useCapture);
                  }
  
                  return this;
              }
  
              if (isObject(eventType)) {
                  for (var prop in eventType) {
                      this.on(prop, eventType[prop], listener);
                  }
  
                  return this;
              }
  
              if (eventType === 'wheel') {
                  eventType = wheelEvent;
              }
  
              // convert to boolean
              useCapture = useCapture? true: false;
  
              if (contains(eventTypes, eventType)) {
                  // if this type of event was never bound to this Interactable
                  if (!(eventType in this._iEvents)) {
                      this._iEvents[eventType] = [listener];
                  }
                  else {
                      this._iEvents[eventType].push(listener);
                  }
              }
              // delegated event for selector
              else if (this.selector) {
                  if (!delegatedEvents[eventType]) {
                      delegatedEvents[eventType] = {
                          selectors: [],
                          contexts : [],
                          listeners: []
                      };
  
                      // add delegate listener functions
                      for (i = 0; i < documents.length; i++) {
                          events.add(documents[i], eventType, delegateListener);
                          events.add(documents[i], eventType, delegateUseCapture, true);
                      }
                  }
  
                  var delegated = delegatedEvents[eventType],
                      index;
  
                  for (index = delegated.selectors.length - 1; index >= 0; index--) {
                      if (delegated.selectors[index] === this.selector
                          && delegated.contexts[index] === this._context) {
                          break;
                      }
                  }
  
                  if (index === -1) {
                      index = delegated.selectors.length;
  
                      delegated.selectors.push(this.selector);
                      delegated.contexts .push(this._context);
                      delegated.listeners.push([]);
                  }
  
                  // keep listener and useCapture flag
                  delegated.listeners[index].push([listener, useCapture]);
              }
              else {
                  events.add(this._element, eventType, listener, useCapture);
              }
  
              return this;
          }