views:

1082

answers:

4

This is what I have currently:

$("#cart-summary").mouseenter(function () {
 $('.flycart').delay(500).slideDown('fast');
});
$(".flycart").mouseleave(function () {
 $('.flycart').delay(500).slideUp('fast');
}).find('a.close').click(function(){
   $(this).parents('.flycart').hide();
});

What it does is:

If mouseover #cart-summary -> open flycart after 500ms

if mouseout .flycart -> close flycart after 500ms

What I need is:

If mouseover #cart-summary for ATLEAST 500ms -> open flycart

if mouseout .flycart for ATLEAST 500ms -> close flycart

Edited to Add: I also use hoverIntent, if that can be used here?

Many thanks!

+3  A: 

Sounds like you might need the HoverIntent plugin.

I don't know if it'll help you with the mouseout ATLEAST 500ms though. But maybe there's an option in there for that.

slolife
Great, I'm already using it for other stuff, how do I apply it here? Thanks!
Nimbuz
Found a similar request here: http://stackoverflow.com/questions/1482029/waiting-x-milliseconds-after-an-event-recheck-and-trigger but I want to use hoverIntent if possible.
Nimbuz
+1  A: 

You can use the hoverIntent plugin as follows:

var config = {    
     sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)    
     interval: 500, // number = milliseconds for onMouseOver polling interval    
     timeout: 500, // number = milliseconds delay before onMouseOut    
};

$(".flycart").hoverIntent(function () {
        $('.flycart').slideDown('fast');
}, function() {
        $('.flycart').slideUp('fast');
}).find('a.close').click(function(){
   $(this).parents('.flycart').hide();
});
karim79
+2  A: 

Use the setTimeout to check if a flag you set/unset (I'm using a class) is still valid.

$("#cart-summary").mouseenter(function () {
    $("#cart-summary").addClass("hasFocus");
    setTimeout(function(){ 
        if ($("#cart-summary").hasClass("hasFocus")) {}
            $('.flycart').slideDown('fast');
        }
      }, 500 );
      });

$("#cart-summary").mouseleave(function () {
    $("#cart-summary").removeClass("hasFocus");
});


$(".flycart").mouseenter(function () {
    $("#cart-summary").removeClass("lostFocus");    
});

$(".flycart").mouseleave(function () {
    $("#cart-summary").addClass("lostFocus");
    setTimeout(function(){ 
        if ($("#cart-summary").hasClass("hasFocus")) { 
            $('.flycart').slideUp('fast');
            }).find('a.close').click(function(){
            $(this).parents('.flycart').hide();
        }
    }, 500)
});
Lance Rushing
A: 

You could do:

var timeout,
    $flycart = $(".flycart"),
    $summary = $("#cart-summary"),
    delay = 500;

$summary.mouseenter(function () {
    if (timeout) window.clearTimeout(timeout);
    timeout = window.setTimeout(function(){
        if ( $flycart.is(":visible") ) {
            $flycart.slideDown('fast');
        }
    }, delay);
});
$flycart.mouseleave(function () {
    if (timeout) window.clearTimeout(timeout);
    timeout = window.setTimeout(function(){
        if ( $flycart.is(":visible") ) {
            $flycart.slideUp('fast');
        }
    }, delay);
})...
Joe Flateau