Skip to content

Commit

Permalink
Merge pull request #65 from Spredfast/fix-hoverleave
Browse files Browse the repository at this point in the history
Force hover leave on new mouseenter. Fixes #63 and #64.
  • Loading branch information
daffl committed Feb 6, 2013
2 parents 692ed50 + 667b07d commit e86776a
Showing 1 changed file with 26 additions and 3 deletions.
29 changes: 26 additions & 3 deletions event/hover/hover.js
Expand Up @@ -110,11 +110,28 @@ steal('jquery', 'jquery/event/livehack', function ($) {
// now start checking mousemoves to update location
var delegate = ev.delegateTarget || ev.currentTarget;
var selector = ev.handleObj.selector;
var pending = $.data(delegate,"_hover"+selector);
// prevents another mouseenter until current has run its course
if ($.data(delegate, "_hover" + selector)) {
if(pending) {
// Under some circumstances, mouseleave may never fire
// (e.g., the element is removed while hovered)
// so if we've entered another element, wait the leave time,
// then force it to release.
if(!pending.forcing) {
pending.forcing = true;
clearTimeout(pending.leaveTimer);
var leaveTime = pending.leaving ?
Math.max(0,pending.hover.leave - (new Date() - pending.leaving)) :
pending.hover.leave;
var self = this;

setTimeout(function() {
pending.callHoverLeave();
onmouseenter.call(self,ev);
},leaveTime);
}
return;
}
$.data(delegate, "_hover" + selector, true)
var loc = {
pageX : ev.pageX,
pageY : ev.pageY
Expand Down Expand Up @@ -158,7 +175,8 @@ steal('jquery', 'jquery/event/livehack', function ($) {
} else {
clearTimeout(leaveTimer);
// leave the hover after the time set in hover.leave(time)
leaveTimer = setTimeout(function () {
pending.leaving = new Date();
leaveTimer = pending.leaveTimer = setTimeout(function(){
callHoverLeave();
}, hover._leave)
}
Expand All @@ -178,6 +196,11 @@ steal('jquery', 'jquery/event/livehack', function ($) {
})
hovered = true;
};
pending = {
callHoverLeave: callHoverLeave,
hover: hover
};
$.data(delegate,"_hover"+selector, pending);

// Bind the mousemove event
$(enteredEl).bind("mousemove", mousemove).bind("mouseleave", mouseleave);
Expand Down

0 comments on commit e86776a

Please sign in to comment.