fastfix.js |            |
|---|---|
               (function ($) { |            |
|                                http://bitovi.com/blog/2012/04/faster-jquery-event-fix.html https://gist.github.com/2377196 IE 8 has Object.defineProperty but it only defines DOM Nodes. According to http://kangax.github.com/es5-compat-table/#define-property-ie-note All browser that have Object.defineProperties also support Object.defineProperty properly  |                               if (Object.defineProperties) {
    var |            
|                                Use defineProperty on an object to set the value and return it  |                                 set = function (obj, prop, val) {
      if (val !== undefined) {
        Object.defineProperty(obj, prop, {
          value: val
        });
      }
      return val;
    }, |            
|                                special converters  |                                   special = {
        pageX: function (original) {
          if (!original) {
            return;
          }
          var eventDoc = this.target.ownerDocument || document;
          doc = eventDoc.documentElement;
          body = eventDoc.body;
          return original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
        },
        pageY: function (original) {
          if (!original) {
            return;
          }
          var eventDoc = this.target.ownerDocument || document;
          doc = eventDoc.documentElement;
          body = eventDoc.body;
          return original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
        },
        relatedTarget: function (original) {
          if (!original) {
            return;
          }
          return original.fromElement === this.target ? original.toElement : original.fromElement;
        },
        metaKey: function (originalEvent) {
          if (!originalEvent) {
            return;
          }
          return originalEvent.ctrlKey;
        },
        which: function (original) {
          if (!original) {
            return;
          }
          return original.charCode != null ? original.charCode : original.keyCode;
        }
      }; |            
|                                Get all properties that should be mapped  |                                 $.each($.event.keyHooks.props.concat($.event.mouseHooks.props).concat($.event.props), function (i, prop) {
      if (prop !== "target") {
        (function () {
          Object.defineProperty($.Event.prototype, prop, {
            get: function () { |            
|                                get the original value, undefined when there is no original event  |                                           var originalValue = this.originalEvent && this.originalEvent[prop]; |            
|                                overwrite getter lookup  |                                           return this['_' + prop] !== undefined ? this['_' + prop] : set(this, prop, |            
|                                if we have a special function and no value  |                                           special[prop] && originalValue === undefined ? |            
|                                call the special function  |                                           special[prop].call(this, this.originalEvent) : |            
|                                use the original value  |                                           originalValue)
            },
            set: function (newValue) { |            
|                                Set the property with underscore prefix  |                                           this['_' + prop] = newValue;
            }
          });
        })();
      }
    });
    $.event.fix = function (event) {
      if (event[$.expando]) {
        return event;
      } |            
|                                Create a jQuery event with at minimum a target and type set  |                                   var originalEvent = event,
        event = $.Event(originalEvent);
      event.target = originalEvent.target; |            
|                                Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)  |                                   if (!event.target) {
        event.target = originalEvent.srcElement || document;
      } |            
|                                Target should not be a text node (#504, Safari)  |                                   if (event.target.nodeType === 3) {
        event.target = event.target.parentNode;
      }
      return event;
    }
  }
  return $;
})(jQuery);
 |