(function(){ | |
var set = function(obj, prop, val){ | |
Object.defineProperty(obj,prop,{ | |
value : val | |
}) | |
return val; | |
}; | |
var special = { | |
pageX : function(original){ | |
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){ | |
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){ | |
return original.fromElement === this.target ? original.toElement : original.fromElement; | |
}, | |
which : function(original){ | |
var button = original.button; | |
return ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); | |
}, | |
metaKey : function(originalEvent){ | |
return originalEvent.ctrlKey; | |
}, | |
which : function(original){ | |
return original.charCode != null ? original.charCode : original.keyCode; | |
} | |
}; | |
$.each($.event.keyHooks.props.concat($.event.mouseHooks.props).concat($.event.props), function(i, prop){ | |
if(prop !== "target"){ | |
Object.defineProperty(jQuery.Event.prototype,prop,{ | |
get : function(){ | |
// get the original value | |
var originalValue = this.originalEvent[prop] | |
// overwrite getter lookup | |
return set(this,prop, | |
// if we have a special function and no value | |
special[prop] && originalValue == null ? | |
// call the special function | |
special[prop].call(this, this.originalEvent) : | |
// use the original value | |
originalValue ) | |
} | |
}) | |
} | |
}) | |
$.event.fix = function(event){ | |
if ( event[ jQuery.expando ] ) { | |
return event; | |
} | |
// Create a jQuery event with at minimum a target and type set | |
var originalEvent = event, | |
event = jQuery.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; | |
} | |
})(); |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
Show comment Hide comment
jdalton
commented
Apr 13, 2012
A couple of issues:
|
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
Show comment Hide comment
justinbmeyer
Apr 13, 2012
Thanks! I wasn't trying to write it perfect yet (wrote it on plane to India a little sleep). But if we do make this a plugin to JMVC, we will certainly fix these issues.
On 3, this was lifted from jQuery, you might want to let them know about it too.
Thanks! I wasn't trying to write it perfect yet (wrote it on plane to India a little sleep). But if we do make this a plugin to JMVC, we will certainly fix these issues. On 3, this was lifted from jQuery, you might want to let them know about it too. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A couple of issues:
which
defined twice in thespecial
object.configurable
,set
(to make it writable), andenumerable
so they default tofalse
which is an implementation inconsistency cross-browser (old IE and the like).document
infix
useevent.currentTarget
andcurrentTarget.ownerDocument || currentTarget
so that it works cross-frame.Object.defineProperty
in yourset
function justdelete obj[prop]; obj[prop] = val;
assuming you set it initially withconfigurable: true
.Object.defineProperty
as some browsers don't have it or it only works on DOM elements (IE8).