J'ai des problèmes avec la onmouseout
fonction dans un div positon absolu. Lorsque la souris frappe un élément enfant dans le div, l'événement mouseout se déclenche, mais je ne veux pas qu'il se déclenche tant que la souris n'est pas hors du div absolu parent.
Comment puis-je empêcher l' mouseout
événement de se déclencher lorsqu'il frappe un élément enfant SANS jquery.
Je sais que cela a quelque chose à voir avec le bouillonnement d'événements, mais je n'ai pas de chance de savoir comment résoudre ce problème.
J'ai trouvé un article similaire ici: Comment désactiver les événements mouseout déclenchés par des éléments enfants?
Cependant, cette solution utilise jQuery.
Réponses:
J'ai fait une démo rapide de JsFiddle, avec tout le CSS et le HTML nécessaires, regardez-le ...
Lien EDIT FIXED pour la prise en charge de plusieurs navigateurs http://jsfiddle.net/RH3tA/9/
Notez que cela ne vérifie que le parent immédiat, si le div parent avait des enfants imbriqués, vous devez en quelque sorte traverser les éléments parents à la recherche de l '"élément d'origine"
Exemple EDIT pour les enfants imbriqués
EDIT corrigé pour, espérons-le, multi-navigateur
Et un nouveau lien JSFiddle , EDIT mis à jour
la source
mouseleave
est la bonne réponseUtilisez
onmouseleave
.Ou, dans jQuery, utilisez
mouseleave()
C'est exactement ce que vous recherchez. Exemple:
ou, dans jQuery:
un exemple est ici .
la source
onMouseLeave
c'est ce que j'ai fini par utiliser car il ne bouillonne pas.mouseleave
ne peut pas être annulé.Pour une solution CSS pure plus simple qui fonctionne dans certains cas ( IE11 ou plus récent ), on pourrait supprimer les enfants en les
pointer-events
définissant surnone
la source
pointer-events
propriétéVoici une solution plus élégante basée sur ce qui suit. il tient compte des événements qui remontent à plus d'un niveau d'enfants. Cela tient également compte des problèmes entre navigateurs.
la source
this
de la ligne de définition de fonction @GregoryLewis mentionné le problème. Aussi pour plus de support multi-navigateurs, essayez ceci: if (window.addEventListener) {document.getElementById ('parent'). AddEventListener ('mouseout', onMouseOut, true); } else if (window.attachEvent) {document.getElementById ('parent'). attachEvent ("onmouseout", onMouseOut); }Merci à Amjad Masad qui m'a inspiré.
J'ai la solution suivante qui semble fonctionner dans IE9, FF et Chrome et le code est assez court (sans la fermeture complexe et les choses enfants transversales):
la source
au lieu de onmouseout, utilisez onmouseleave.
Vous ne nous avez pas montré votre code spécifique, je ne peux donc pas vous montrer dans votre exemple spécifique comment le faire.
Mais c'est très simple: remplacez simplement onmouseout par onmouseleave.
C'est tout :) Donc, simple :)
Si vous ne savez pas comment procéder, reportez-vous aux explications sur:
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_onmousemove_leave_out
Peace of cake :) Profitez-en :)
la source
Si vous utilisez jQuery, vous pouvez également utiliser la fonction "mouseleave", qui s'occupe de tout cela pour vous.
do_something se déclenchera lorsque la souris entre dans la division cible ou l'un de ses enfants, do_something_else ne se déclenchera que lorsque la souris quittera la division cible et l'un de ses enfants.
la source
Je pense que Quirksmode a toutes les réponses dont vous avez besoin (comportement de bouillonnement de différents navigateurs et événements mouseenter / mouseleave ), mais je pense que la conclusion la plus courante de cet événement bouillonnant est l'utilisation d'un cadre comme JQuery ou Mootools (qui a le mouseenter et les événements mouseleave , qui sont exactement ce que vous aviez pressenti).
Jetez un œil à la façon dont ils le font, si vous le souhaitez, faites-le vous
- même ou vous pouvez créer votre version personnalisée "lean mean" de Mootools avec juste la partie événement (et ses dépendances).
la source
Essayer
mouseleave()
Exemple :
;)
la source
J'ai trouvé une solution très simple,
utilisez simplement l'événement onmouseleave = "myfunc ()" plutôt que l'événement onmousout = "myfunc ()"
Dans mon code, cela a fonctionné !!
Exemple:
Même exemple avec la fonction mouseout:
J'espère que ça aide :)
la source
Bien que la solution que vous avez mentionnée utilise jquery, mouseenter et mouseleave sont des événements dom natifs, vous pouvez donc l'utiliser sans jquery.
la source
Il existe deux façons de gérer cela.
1) Vérifiez le résultat event.target dans votre rappel pour voir s'il correspond à votre div parent
2) Ou utilisez la capture d'événements et appelez event.stopPropagation dans la fonction de rappel
la source
Je le fais fonctionner comme un charme avec ceci:
Ah, et le
MyDiv
tag est comme ça:De cette façon, quand onmouseout va à un enfant, petit-enfant, etc ... le
style.display='none'
n'est pas exécuté; mais quand onmouseout sort de MyDiv, il s'exécute.Donc pas besoin d'arrêter la propagation, d'utiliser des minuteries, etc ...
Merci pour les exemples, je pourrais créer ce code à partir d'eux.
J'espère que cela aide quelqu'un.
Peut également être amélioré comme ceci:
Et puis les balises DIV comme ceci:
Donc plus général, non seulement pour un div et pas besoin d'ajouter
id="..."
sur chaque couche.la source
Si vous avez accès à l'élément auquel l'événement est attaché à l'intérieur de la
mouseout
méthode, vous pouvez l'utilisercontains()
pour voir si leevent.relatedTarget
est un élément enfant ou non.Tout
event.relatedTarget
comme l'élément dans lequel la souris est passée, s'il ne s'agit pas d'un élément enfant, vous vous êtes éloigné de l'élément.la source
Sur Angular 5, 6 et 7
Puis sur
la source
Je vérifie le décalage de l'élément d'origine pour obtenir les coordonnées de page des limites de l'élément, puis je m'assure que l'action de sortie de la souris n'est déclenchée que lorsque la sortie de la souris est en dehors de ces limites. Sale mais ça marche.
la source
la source
Si vous avez ajouté (ou avez) une classe CSS ou un identifiant à l'élément parent, vous pouvez faire quelque chose comme ceci:
Donc, les choses ne sont exécutées que lorsque l'événement est sur la div parent.
la source
Je voulais juste partager quelque chose avec vous.
J'ai eu du mal avec
ng-mouseenter
et lesng-mouseleave
événements.L'étude de cas:
J'ai créé un menu de navigation flottant qui bascule lorsque le curseur se trouve sur une icône.
Ce menu était en haut de chaque page.
ng-class="{down: vm.isHover}"
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Pour l'instant, tout allait bien et fonctionnait comme prévu.
La solution est propre et simple.
Le problème entrant:
Dans une vue spécifique, j'ai une liste d'éléments.
J'ai ajouté un panneau d'action lorsque le curseur est sur un élément de la liste.
J'ai utilisé le même code que ci-dessus pour gérer le comportement.
Le problème:
J'ai compris que lorsque mon curseur est sur le menu de navigation flottant et également en haut d'un élément, il y a un conflit entre eux.
Le panneau d'action est apparu et la navigation flottante était masquée.
Le fait est que même si le curseur se trouve sur le menu de navigation flottant, l'élément de liste ng-mouseenter est déclenché.
Cela n'a aucun sens pour moi, car je m'attendrais à une interruption automatique des événements de propagation de la souris.
Je dois dire que j'ai été déçu et que je passe du temps à découvrir ce problème.
Premières réflexions:
J'ai essayé d'utiliser ceux-ci:
$event.stopPropagation()
$event.stopImmediatePropagation()
J'ai combiné beaucoup d'événements de pointeurs ng (mousemove, mouveover, ...) mais aucun ne m'aide.
Solution CSS:
J'ai trouvé la solution avec une simple propriété css que j'utilise de plus en plus:
En gros, je l'utilise comme ça (sur mes éléments de liste):
Avec celui-ci délicat, les événements ng-mouse ne seront plus déclenchés et mon menu de navigation flottant ne se fermera plus lorsque le curseur sera dessus et sur un élément de la liste.
Pour aller plus loin:
Comme vous vous en doutez, cette solution fonctionne mais je ne l'aime pas.
Nous ne contrôlons pas nos événements et c'est mauvais.
De plus, vous devez avoir accès à la
vm.isHover
portée pour y parvenir et cela peut ne pas être possible ou possible mais sale d'une manière ou d'une autre.Je pourrais faire un violon si quelqu'un veut regarder.
Néanmoins, je n'ai pas d'autre solution ...
C'est une longue histoire et je ne peux pas vous donner une pomme de terre alors pardonnez-moi mon ami.
Quoi qu'il en soit,
pointer-events: none
c'est la vie, alors souvenez-vous-en.la source