Skip to content

Commit e2d9b02

Browse files
committed
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.
1 parent 370bc00 commit e2d9b02

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

tests/jquery.simulate.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ $.extend( $.simulate.prototype, {
4545
}
4646
},
4747
mouseEvent: function( type, options ) {
48-
var evt;
48+
var evt, eventDoc, doc, body;
4949
var e = $.extend({
5050
bubbles: true,
5151
cancelable: (type !== "mousemove"),
@@ -71,6 +71,30 @@ $.extend( $.simulate.prototype, {
7171
e.screenX, e.screenY, e.clientX, e.clientY,
7272
e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
7373
e.button, e.relatedTarget || document.body.parentNode );
74+
75+
// IE 9+ creates events with pageX and pageY set to 0.
76+
// Trying to modify the properties throws an error,
77+
// so we define getters to return the correct values.
78+
if ( evt.pageX === 0 && evt.pageY === 0 && Object.defineProperty ) {
79+
eventDoc = evt.relatedTarget.ownerDocument || document;
80+
doc = eventDoc.documentElement;
81+
body = eventDoc.body;
82+
83+
Object.defineProperty( evt, "pageX", {
84+
get: function() {
85+
return e.clientX +
86+
( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
87+
( doc && doc.clientLeft || body && body.clientLeft || 0 );
88+
}
89+
});
90+
Object.defineProperty( evt, "pageY", {
91+
get: function() {
92+
return e.clientY +
93+
( doc && doc.scrollTop || body && body.scrollTop || 0 ) -
94+
( doc && doc.clientTop || body && body.clientTop || 0 );
95+
}
96+
});
97+
}
7498
} else if ( document.createEventObject ) {
7599
evt = document.createEventObject();
76100
$.extend( evt, e );

0 commit comments

Comments
 (0)