javascriptjquerymouseoverjquery-eventsmouseout

Javascript "mouseover" and "mouseout" events


Consider the following code:

HTML:

<div class='a'></div>
<div class='b'></div>

CSS:

body {
    position: relative;
}
.a {
    position: absolute;
    left: 100px;
    top: 100px;
    width: 100px;
    height: 100px;
    background: #777;
}
.b {
    position: absolute;
    display: none;
    background: red;
}

JavaScript:

$(function() {
    $('.a').live('mouseover mouseout', function(e) {
        switch (e.type) {
            case 'mouseover': {
                $('.b').offset({'left': $(this).offset().left,
                                'top': $(this).offset().top})
                       .width($(this).outerWidth())
                       .height($(this).outerHeight())
                       .show();
                break;
            }       
            case 'mouseout': {
                $('.b').hide();
                break;
            }        
        }
    });
});

As you can see here, some kind of flickering occurs, because when .b is shown, mouseout automatically occurs. How would you solve this problem ?

The desired behavior is: when the mouse is over .a, .b should be shown (should cover .a), and when the mouse is not over .a, .b should not be shown. .a should always be shown.

The position and dimensions of .a is not constant (should be calculated on the fly).


Solution

  • I come up with this solution:

    $(function() {
        $('.a').live('mouseover', function(e) {
            $('.b').offset({'left': $(this).offset().left,
                            'top': $(this).offset().top})
                   .width($(this).outerWidth())
                   .height($(this).outerHeight())
                   .show();
        });
        $('.b').live('mouseout', function(e) {
            $(this).hide();
        });
    });