Created
November 1, 2012 17:32
-
-
Save greghaygood/3995229 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// http://acko.net/blog/mouse-handling-and-absolute-positions-in-javascript/ | |
/** | |
* Retrieve the coordinates of the given event relative to the center | |
* of the widget. | |
* | |
* @param event | |
* A mouse-related DOM event. | |
* @param reference | |
* A DOM element whose position we want to transform the mouse coordinates to. | |
* @return | |
* A hash containing keys 'x' and 'y'. | |
*/ | |
getAbsolutePosition = function(element) { | |
var r = { x: element.offsetLeft, y: element.offsetTop }; | |
if (element.offsetParent) { | |
var tmp = getAbsolutePosition(element.offsetParent); | |
r.x += tmp.x; | |
r.y += tmp.y; | |
} | |
return r; | |
}; | |
getRelativeCoordinates = function(event, reference) { | |
var x, y; | |
event = event || window.event; | |
var el = event.target || event.srcElement; | |
if (!window.opera && typeof event.offsetX != 'undefined') { | |
// Use offset coordinates and find common offsetParent | |
var pos = { x: event.offsetX, y: event.offsetY }; | |
// Send the coordinates upwards through the offsetParent chain. | |
var e = el; | |
while (e) { | |
e.mouseX = pos.x; | |
e.mouseY = pos.y; | |
pos.x += e.offsetLeft; | |
pos.y += e.offsetTop; | |
e = e.offsetParent; | |
} | |
// Look for the coordinates starting from the reference element. | |
var e = reference; | |
var offset = { x: 0, y: 0 }; | |
while (e) { | |
if (typeof e.mouseX != 'undefined') { | |
x = e.mouseX - offset.x; | |
y = e.mouseY - offset.y; | |
break; | |
} | |
offset.x += e.offsetLeft; | |
offset.y += e.offsetTop; | |
e = e.offsetParent; | |
} | |
// Reset stored coordinates | |
e = el; | |
while (e) { | |
e.mouseX = undefined; | |
e.mouseY = undefined; | |
e = e.offsetParent; | |
} | |
} | |
else { | |
// Use absolute coordinates | |
var pos = getAbsolutePosition(reference); | |
x = event.pageX - pos.x; | |
y = event.pageY - pos.y; | |
} | |
// Subtract distance to middle | |
return { x: x, y: y }; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment