Search code examples
jquerymouseeventmouseover

Show popup if the mouse is hovered over an element for a period of time


I'm wondering how to show a popup/tipbox when a mouse has been hovered over an element for a period of time, e.g. pseudo code:

if mouseover
    if hovered for more than 2 seconds
       --> show popup/tipbox
    else
       ---> cancel mouseover
else if mouseout
    --> reset timer/cancel mouseover

I've done this so far, but it doesn't work effectively, if I hover and move the mouse quickly, it will still show the popup/tipbox.

$('a[rel=tip]').live('mouseover mouseout', function(e)
{
    if(e.type == 'mouseover')
    {
        var mouseTime = setTimeout(function()
        {
            $('.tipbox').slideDown('fast');
        }, 1000);
    }
    else if(e.type == 'mouseout')
    {
        if(mouseTime)
        {
            cancelTimeout(mouseTime);
            mouseTime = null;
            $('.tipbox').slideUp('fast');   
        }
    }
});

EDIT: Bounty added.


Solution

  • This seems to work for me:

    HTML

    <span id="someElem"> Hover me for 2 seconds! </span>
    

    JS

    var tooltipTimeout;
        
    $("#someelem").hover(function()
    {
        tooltipTimeout = setTimeout(showTooltip, 2000);
    }, hideTooltip);
        
    function showTooltip()
    {
        var tooltip = $("<div id='tooltip' class='tooltip'>I'm the tooltip!</div>");
        tooltip.appendTo($("#someelem"));
    }
        
    function hideTooltip()
    {
        clearTimeout(tooltipTimeout);
        $("#tooltip").fadeOut().remove();
    }
    

    CSS

    #someElem
    {
        cursor: pointer;
    }
        
    .tooltip
    {
        display: block;
        position: absolute;
        background-color: rgb(130, 150, 200);
        padding: 5px;
    }