Как я могу вызвать событие 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 ..
}
}