Skip to content
Permalink
Browse files

Simulate: Define getters for pageX and pageY in mouse events if they …

…come through as 0. Fixes #7324 - simulate mouse events broken for IE 9.
  • Loading branch information
scottgonzalez committed Jan 12, 2012
1 parent 370bc00 commit e2d9b02c56ee92fa92913b451598b59a385db609
Showing with 25 additions and 1 deletion.
  1. +25 −1 tests/jquery.simulate.js
@@ -45,7 +45,7 @@ $.extend( $.simulate.prototype, {
}
},
mouseEvent: function( type, options ) {
var evt;
var evt, eventDoc, doc, body;
var e = $.extend({
bubbles: true,
cancelable: (type !== "mousemove"),
@@ -71,6 +71,30 @@ $.extend( $.simulate.prototype, {
e.screenX, e.screenY, e.clientX, e.clientY,
e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
e.button, e.relatedTarget || document.body.parentNode );

// IE 9+ creates events with pageX and pageY set to 0.
// Trying to modify the properties throws an error,
// so we define getters to return the correct values.
if ( evt.pageX === 0 && evt.pageY === 0 && Object.defineProperty ) {
eventDoc = evt.relatedTarget.ownerDocument || document;
doc = eventDoc.documentElement;
body = eventDoc.body;

Object.defineProperty( evt, "pageX", {
get: function() {
return e.clientX +
( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
( doc && doc.clientLeft || body && body.clientLeft || 0 );
}
});
Object.defineProperty( evt, "pageY", {
get: function() {
return e.clientY +
( doc && doc.scrollTop || body && body.scrollTop || 0 ) -
( doc && doc.clientTop || body && body.clientTop || 0 );
}
});
}
} else if ( document.createEventObject ) {
evt = document.createEventObject();
$.extend( evt, e );

1 comment on commit e2d9b02

@rdworth

This comment has been minimized.

Copy link
Contributor

@rdworth rdworth commented on e2d9b02 Jan 12, 2012

Awesome. Thanks Scott

Please sign in to comment.
You can’t perform that action at this time.