События mouseover и mouseout в Javascript

Рассмотрим следующий код:

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;
            }        
        }
    });
});

Как вы можете видеть здесь, происходит какое-то мерцание, потому что когда отображается .b, автоматически появляется mouseout. Как бы вы решили эту проблему?

Желаемое поведение: когда мышь находится над .a, должно отображаться .b (должно закрывать .a), а когда мышь не находится над .a, .b не должно отображаться. .a должен отображаться всегда.

Положение и размеры .a непостоянны (должны рассчитываться на лету).


person Misha Moroshko    schedule 16.09.2010    source источник
comment
Должен ли .b закрывать .a изначально?   -  person David says reinstate Monica    schedule 16.09.2010
comment
Нет. Только когда мышь становится над .a.   -  person Misha Moroshko    schedule 16.09.2010
comment
Вы можете попробовать сделать .b дочерним элементом .a, хотя иногда это нежелательно.   -  person Yi Jiang    schedule 16.09.2010
comment
Вы пытались добавить таймер на несколько миллисекунд, чтобы он мог запускать событие мыши над событием и поддерживать его отображение?   -  person Opal    schedule 16.09.2010
comment
Мне не нравится идея тайм-аута. Я ищу более чистое решение.   -  person Misha Moroshko    schedule 16.09.2010
comment
Почему вы устанавливаете значения в обработчике наведения мыши? Вы могли бы поместить атрибуты left, top, width и height в CSS для b, не так ли?   -  person Jason Goemaat    schedule 16.09.2010
comment
Я не понимаю, как. Не могли бы вы показать код, пожалуйста?   -  person Misha Moroshko    schedule 16.09.2010


Ответы (2)


Я придумал это решение:

$(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();
    });
});
person Misha Moroshko    schedule 16.09.2010
comment
измените $('.b').offset на $('.b').css при настройке положения. в противном случае это работает. - person lincolnk; 16.09.2010

Пытаться

$(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) {
        $('.b').hide();
        break;
    });
});

Это должно означать, что когда пользователь перемещает мышь над областью a, отображается область b, а затем, когда он перемещает мышь за пределы области b, снова отображается область a.

person Opal    schedule 16.09.2010
comment
Это именно то решение, которое я придумал :) Но нет, я думаю, что это недостаточно хорошо, потому что размеры .b могут отличаться от размеров .a. У вас есть другая идея? - person Misha Moroshko; 16.09.2010