swisnl/jQuery-contextMenu

AutoHide does not work properly when the trigger object is affixed on screen.

alickq opened this issue · 1 comments

I have created a web site that has a tree object on the left hand side and some content on the right. I fixed the position of the tree so that when the window scroll, the tree stays. When I ture on the AutoHide feature, it does not recognize the fact that I am still inside the trigger object when I move my mouse so the menu disappear as soon as I move my mouse to the left just by a tiny little bit. I have looked at the source code and found that you are using .position() function to get the position of the menu. If I change it to use .offset() instead, it all worked fine. I am wondering if there is a reason why you use .position() over .offset()? Here is the code segment:

        if (opt.autoHide) {
            // trigger element coordinates

// var pos = $this.position();

            // change to use .offset instead as .position returns position relative to offset parent where offset is relative to 
            //       the page or document.  It will not work if the triggering object has a fix position if we use .position.
            var pos = $this.offset();
            pos.right = pos.left + $this.outerWidth();
            pos.bottom = pos.top + this.outerHeight();
            // mouse position handler
            $(document).on('mousemove.contextMenuAutoHide', function(e) {
                if (opt.$layer && !opt.hovering && (!(e.pageX >= pos.left && e.pageX <= pos.right) || !(e.pageY >= pos.top && e.pageY <= pos.bottom))) {
                    // if mouse in menu...
                    opt.$menu.trigger('contextmenu:hide');
                }
            });
        }

I'll look into this around christmas. The jQuery.offset() hunch is confirmed.