Estoy teniendo problemas con la onmouseout
función en un div positonado absoluto. Cuando el mouse golpea un elemento hijo en el div, el evento mouseout se dispara, pero no quiero que se active hasta que el mouse esté fuera del padre, div absoluto.
¿Cómo puedo evitar que el mouseout
evento se active cuando golpea un elemento hijo SIN jquery?
Sé que esto tiene algo que ver con el burbujeo de eventos, pero no tengo suerte en descubrir cómo resolver esto.
Encontré una publicación similar aquí: ¿Cómo deshabilitar los eventos de mouseout activados por elementos secundarios?
Sin embargo, esa solución usa jQuery.
Respuestas:
Hice una demostración rápida de JsFiddle, con todo el CSS y HTML necesarios, échale un vistazo ...
EDITAR enlace FIJO para compatibilidad entre navegadores http://jsfiddle.net/RH3tA/9/
TENGA EN CUENTA que esto solo verifica el elemento primario inmediato, si el elemento primario div había anidado elementos secundarios, entonces tiene que atravesar de alguna manera los elementos primarios que buscan el "elemento original"
EDITAR ejemplo para niños anidados
EDITAR Corregido para con suerte navegador cruzado
Y un nuevo enlace actualizado JSFiddle , EDIT
fuente
mouseleave
es la respuesta correctaUso
onmouseleave
.O, en jQuery, use
mouseleave()
Es exactamente lo que estás buscando. Ejemplo:
o, en jQuery:
Un ejemplo está aquí .
fuente
onMouseLeave
es lo que terminé usando también, ya que no burbujea.mouseleave
No puede ser cancelable.Para una solución CSS pura más simple que funcione en algunos casos ( IE11 o más reciente ), uno podría eliminar los niños
pointer-events
configurándolos ennone
fuente
pointer-events
propiedadAquí hay una solución más elegante basada en lo que vino a continuación. explica el evento que brota de más de un nivel de niños. También tiene en cuenta los problemas entre navegadores.
fuente
this
de la línea de definición de función que @GregoryLewis mencionó solucionó el problema. También para obtener más compatibilidad entre navegadores, intente esto: if (window.addEventListener) {document.getElementById ('parent'). AddEventListener ('mouseout', onMouseOut, true); } else if (window.attachEvent) {document.getElementById ('parent'). attachEvent ("onmouseout", onMouseOut); }Gracias a Amjad Masad que me inspiró.
Tengo la siguiente solución que parece funcionar en IE9, FF y Chrome y el código es bastante corto (sin el cierre complejo y los elementos secundarios transversales):
fuente
en lugar de onmouseout, use onmouseleave.
No nos ha mostrado su código específico, por lo que no puedo mostrarle en su ejemplo específico cómo hacerlo.
Pero es muy simple: simplemente reemplace onmouseout con onmouseleave.
Eso es todo :) Entonces, simple :)
Si no está seguro de cómo hacerlo, vea la explicación en:
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_onmousemove_leave_out
Paz de pastel :) Disfrútalo :)
fuente
Si está utilizando jQuery, también puede utilizar la función "mouseleave", que se ocupa de todo esto por usted.
do_something se disparará cuando el mouse entre en thetargetdiv o cualquiera de sus hijos, do_something_else solo se disparará cuando el mouse abandone thetargetdiv y cualquiera de sus hijos.
fuente
Creo que Quirksmode tiene todas las respuestas que necesita (comportamiento de burbujeo de diferentes navegadores y eventos de mouseenter / mouseleave ), pero creo que la conclusión más común de ese desastre de burbujeo de eventos es el uso de un marco como JQuery o Mootools (que tiene el mouseenter y mouseleave eventos, que son exactamente lo que intuyó que sucedería).
Eche un vistazo a cómo lo hacen, si lo desea, hágalo usted mismo
o puede crear su versión personalizada de "Lean mean" de Mootools con solo la parte del evento (y sus dependencias).
fuente
Tratar
mouseleave()
Ejemplo:
;)
fuente
He encontrado una solución muy simple,
simplemente use el evento onmouseleave = "myfunc ()" que el evento onmousout = "myfunc ()"
En mi código funcionó !!
Ejemplo:
Mismo ejemplo con la función mouseout:
Espero eso ayude :)
fuente
Aunque la solución a la que se refirió utiliza jquery, mouseenter y mouseleave son eventos dom nativos, por lo que puede usarlos sin jquery.
fuente
Hay dos formas de manejar esto.
1) Verifique el resultado event.target en su devolución de llamada para ver si coincide con su div padre
2) O utilice la captura de eventos y llame a event.stopPropagation en la función de devolución de llamada
fuente
Hago que funcione como un encanto con esto:
Ah, y la
MyDiv
etiqueta es así:De esta manera, cuando onmouseout va a un hijo, nieto, etc.,
style.display='none'
no se ejecuta; pero cuando onmouseout sale de MyDiv se ejecuta.Por lo tanto, no es necesario detener la propagación, usar temporizadores, etc.
Gracias por los ejemplos, podría hacer este código a partir de ellos.
Espero que esto ayude a alguien.
También se puede mejorar así:
Y luego las etiquetas DIV como esta:
De manera más general, no solo para un div y no es necesario agregar
id="..."
en cada capa.fuente
Si tiene acceso al elemento al que se adjunta el evento dentro del
mouseout
método, puede usarcontains()
para ver sievent.relatedTarget
es un elemento hijo o no.Como
event.relatedTarget
es el elemento al que ha pasado el mouse, si no es un elemento secundario, se ha sacado el elemento del mouse.fuente
En angular 5, 6 y 7
Luego en
fuente
Verifico el desplazamiento del elemento original para obtener las coordenadas de página de los límites del elemento, luego me aseguro de que la acción del mouseout solo se active cuando el mouseout está fuera de esos límites. Sucio pero funciona.
fuente
fuente
Si agregó (o tiene) una clase o id de CSS al elemento padre, puede hacer algo como esto:
Entonces, las cosas solo se ejecutan cuando el evento está en el div padre.
fuente
Solo quería compartir algo contigo.
Me costó un poco con
ng-mouseenter
yng-mouseleave
eventos.El caso de estudio:
Creé un menú de navegación flotante que se alterna cuando el cursor está sobre un icono.
Este menú estaba en la parte superior de cada página.
ng-class="{down: vm.isHover}"
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Por ahora, todo estaba bien y funcionó como se esperaba.
La solución es limpia y simple.
El problema entrante:
En una vista específica, tengo una lista de elementos.
Agregué un panel de acción cuando el cursor está sobre un elemento de la lista.
Usé el mismo código que el anterior para manejar el comportamiento.
El problema:
Descubrí que cuando mi cursor está en el menú de navegación flotante y también en la parte superior de un elemento, hay un conflicto entre ellos.
El panel de acción apareció y la navegación flotante fue ocultar.
La cuestión es que incluso si el cursor está sobre el menú de navegación flotante, se activa el elemento de lista ng-mouseenter.
No tiene sentido para mí, porque esperaría una interrupción automática de los eventos de propagación del mouse.
Debo decir que me sentí decepcionado y dedico algo de tiempo a descubrir ese problema.
Primeros pensamientos:
Traté de usar estos:
$event.stopPropagation()
$event.stopImmediatePropagation()
Combiné muchos eventos de puntero ng (mousemove, mouveover, ...) pero ninguno me ayudó.
Solución CSS:
Encontré la solución con una propiedad css simple que uso cada vez más:
Básicamente, lo uso así (en los elementos de mi lista):
Con este complicado, los eventos ng-mouse ya no se activarán y mi menú de navegación flotante ya no se cerrará cuando el cursor esté sobre él y sobre un elemento de la lista.
Para llegar más lejos:
Como es de esperar, esta solución funciona pero no me gusta.
No controlamos nuestros eventos y es malo.
Además, debe tener acceso al
vm.isHover
alcance para lograrlo y puede que no sea posible o posible, pero sucio de alguna manera u otra.Podría hacer un violín si alguien quiere mirar.
Sin embargo, no tengo otra solución ...
Es una larga historia y no puedo darte una papa, así que perdóname amigo.
De todos modos,
pointer-events: none
es la vida, así que recuérdalo.fuente