Как я могу вызвать событие mouseout для двух элементов в jQuery?

Предположим, что у меня есть два копьяных divs, A и B, которые перекрываются в углу:

+-----+
|     |
|  A  |
|   +-----+
+---|     |
    |  B  |
    |     |
    +-----+

Я хочу вызвать событие, когда мышь оставляет и A и B.

Я пробовал это

$("#a, #b").mouseleave(function() { ... });

Но это вызывает событие, если мышь выходит либо из node. Я хочу, чтобы событие запускалось после того, как мышь не закончила ни один из node.

Есть ли простой способ сделать это? У меня была идея, которая включала глобальные переменные, отслеживающие состояние мыши над каждым div, но я надеялся на что-то более элегантное.

Ответ 1

Я постоянно сталкиваюсь с этой проблемой, и мое "быстрое исправление", если оно соответствует тому, что я делаю, следующее:

var timer;

$("#a, #b").mouseleave(function() {
    timer = setTimeout(doSomething, 10);
}).mouseenter(function() {
    clearTimeout(timer);
});


function doSomething() {
    alert('mouse left');
}

Fiddle: http://jsfiddle.net/adeneo/LdDBn/

Ответ 2

Если вы вставляете второй контейнер внутри первого, нет необходимости в сложном решении jQuery:

http://jsfiddle.net/5cKSf/3/

HTML

<div class="a">
    This is the A div
    <div class="b">
        This is the B div
    </div>
</div>

CSS

.a {
    background-color: red;
    width: 100px;
    height: 100px;
    position: relative;
}

.b {
    background-color: blue;
    width: 100px;
    height: 100px;
    position:absolute;
    top: 50px;
    left: 50px;
}

JS

$('.a').hover(function() {
   alert('mouseenter'); 
}, function() {
   alert('mouseleave');
});

Ответ 3

Я думаю, вы можете добиться этого, используя что-то вроде:

var mouseLeftD1 = false;
var mouseLeftD2 = false;

$('#d1').mouseleave(function() {
  mouseLeftD1 = true;
  if(mouseLeftD2 == true) setTimeout(mouseLeftBoth, 10);
}).mouseenter(function() {
  mouseLeftD1 = false;
});

$('#d2').mouseleave(function() {
  mouseLeftD2 = true;
  if(mouseLeftD1 == true) setTimeout(mouseLeftBoth, 10);
}).mouseenter(function() {
  mouseLeftD2 = false;
});

function mouseLeftBoth() {
  if(mouseLeftD1 && mouseLeftD2) {
    // .. your code here ..
  }
}