2011-12-19 4 views
11

Supposons que j'ai deux divs spearate, A et B, qui se chevauchent dans un coin:Comment déclencher un événement mouseout pour deux éléments dans jQuery?

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

Je veux déclencher un événement lorsque la souris quitte deux A et B.

J'ai essayé cela

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

Mais cela déclenche l'événement si la souris quitte l'un des nœuds. Je veux que l'événement soit déclenché une fois que la souris n'est pas sur l'un ou l'autre nœud.

Y at-il un moyen facile de faire cela? J'ai eu une idée qui impliquait des variables globales en gardant une trace de l'état de la souris sur chaque div, mais j'espérais quelque chose de plus élégant.

+1

Je l'ai vu auparavant. Je pense que vous pouvez calculer les coordonnées * combinées en utilisant '.offset()' pour chaque '#, # b', et quand la position de la souris n'est plus sur les coordonnées combinées, [' $ ('# a, #b ') .trigger (' mouseleave '); '] (http://api.jquery.com/trigger/). –

+0

pouvez-vous faire un fiddle – Rafay

+0

@JarredFarrish Cela semble encore pire que la solution que j'avais en tête. Garder une trace de l'offset du curseur peut être assez lourd. –

Répondre

17

je rencontre ce problème tout le temps, et mon « solution miracle » si elle correspond à ce que je fais est la suivante;

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/

+0

bonne solution! – Murtaza

+0

+2,5 C'est joli! J'aime comment vous avez seulement besoin d'une variable globale et le processus ne nécessite pas autant de finagling que les solutions les plus évidentes. –

+0

+1 pour l'élégance. – techfoobar

0

Je suppose que vous pouvez y parvenir en utilisant quelque chose comme:

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 .. 
    } 
} 
+0

J'ai donné un upvote par erreur, donc je dois redescendre – Murtaza

3

Si vous imbriquer le deuxième récipient à l'intérieur de la première, il n'y a pas besoin d'une solution jQuery complexe:

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'); 
}); 
Questions connexes