summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSolly Ross <sross@redhat.com>2014-05-05 14:29:29 -0400
committerSolly Ross <sross@redhat.com>2014-05-05 14:51:32 -0400
commitc77938efc9f52449c30018bf29422c1d590cdbdc (patch)
tree416095eecb8c9111affead7503f04239bec105ac
parent082027dc8742292ce3e3de0f742fed5c13e68337 (diff)
downloadnovnc-c77938efc9f52449c30018bf29422c1d590cdbdc.tar.gz
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
-rw-r--r--include/util.js74
1 files changed, 64 insertions, 10 deletions
diff --git a/include/util.js b/include/util.js
index 479ed7b..05c1ac3 100644
--- a/include/util.js
+++ b/include/util.js
@@ -302,18 +302,72 @@ Util.load_scripts = function(files) {
}
}
+
// Get DOM element position on page
-Util.getPosition = function (obj) {
- var x = 0, y = 0;
- if (obj.offsetParent) {
+// This solution is based based on http://www.greywyvern.com/?post=331
+// Thanks to Brian Huisman AKA GreyWyvern!
+Util.getPosition = (function() {
+ function getStyle(obj, styleProp) {
+ if (obj.currentStyle) {
+ var y = obj.currentStyle[styleProp];
+ } else if (window.getComputedStyle)
+ var y = window.getComputedStyle(obj, null)[styleProp];
+ return 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 {
- x += obj.offsetLeft;
- y += obj.offsetTop;
- obj = obj.offsetParent;
- } while (obj);
- }
- return {'x': x, 'y': y};
-};
+ curleft += obj.offsetLeft;
+ curtop += obj.offsetTop;
+ } while (obj = obj.offsetParent);
+
+ return {'x': curleft, 'y': curtop};
+ };
+})();
+
// Get mouse event position in DOM element
Util.getEventPosition = function (e, obj, scale) {