Fix for scroll offset in Util.getPosition()

Previously, Util.getPosition didn't deal with scrolling
particularly well.  This fixes that by calculating the
scroll offset when dealing with getting mouse positions.

Credit to @erikgull and @emmar for the initial version of
the fix.  Credit to Brian Huismanfor the initial code.

Closes #295
Relevant to #258
This commit is contained in:
Solly Ross 2014-05-05 14:29:29 -04:00
parent 082027dc87
commit c77938efc9
1 changed files with 64 additions and 10 deletions

View File

@ -302,19 +302,73 @@ Util.load_scripts = function(files) {
} }
} }
// Get DOM element position on page // Get DOM element position on page
Util.getPosition = function (obj) { // This solution is based based on http://www.greywyvern.com/?post=331
var x = 0, y = 0; // Thanks to Brian Huisman AKA GreyWyvern!
if (obj.offsetParent) { Util.getPosition = (function() {
do { function getStyle(obj, styleProp) {
x += obj.offsetLeft; if (obj.currentStyle) {
y += obj.offsetTop; var y = obj.currentStyle[styleProp];
obj = obj.offsetParent; } else if (window.getComputedStyle)
} while (obj); var y = window.getComputedStyle(obj, null)[styleProp];
} return y;
return {'x': x, 'y': y};
}; };
function scrollDist() {
var myScrollTop = 0, myScrollLeft = 0;
var html = document.getElementsByTagName('html')[0];
// get the scrollTop part
if (html.scrollTop && document.documentElement.scrollTop) {
myScrollTop = html.scrollTop;
} else if (html.scrollTop || document.documentElement.scrollTop) {
myScrollTop = html.scrollTop + document.documentElement.scrollTop;
} else if (document.body.scrollTop) {
myScrollTop = document.body.scrollTop;
} else {
myScrollTop = 0;
}
// get the scrollLeft part
if (html.scrollLeft && document.documentElement.scrollLeft) {
myScrollLeft = html.scrollLeft;
} else if (html.scrollLeft || document.documentElement.scrollLeft) {
myScrollLeft = html.scrollLeft + document.documentElement.scrollLeft;
} else if (document.body.scrollLeft) {
myScrollLeft = document.body.scrollLeft;
} else {
myScrollLeft = 0;
}
return [myScrollLeft, myScrollTop];
};
return function (obj) {
var curleft = 0, curtop = 0, scr = obj, fixed = false;
while ((scr = scr.parentNode) && scr != document.body) {
curleft -= scr.scrollLeft || 0;
curtop -= scr.scrollTop || 0;
if (getStyle(scr, "position") == "fixed") {
fixed = true;
}
}
if (fixed && !window.opera) {
var scrDist = scrollDist();
curleft += scrDist[0];
curtop += scrDist[1];
}
do {
curleft += obj.offsetLeft;
curtop += obj.offsetTop;
} while (obj = obj.offsetParent);
return {'x': curleft, 'y': curtop};
};
})();
// Get mouse event position in DOM element // Get mouse event position in DOM element
Util.getEventPosition = function (e, obj, scale) { Util.getEventPosition = function (e, obj, scale) {
var evt, docX, docY, pos; var evt, docX, docY, pos;