Foros del Web » Programando para Internet » Javascript »

Problemas con onMouseOut

Estas en el tema de Problemas con onMouseOut en el foro de Javascript en Foros del Web. Hola, mi duda ahora es la siguiente (seguramente esto a mas de uno ya le abra pasado), tengo un elemento div con un onMouseOut que ...
  #1 (permalink)  
Antiguo 07/12/2010, 00:20
 
Fecha de Ingreso: febrero-2009
Mensajes: 151
Antigüedad: 15 años, 2 meses
Puntos: 1
Problemas con onMouseOut

Hola, mi duda ahora es la siguiente (seguramente esto a mas de uno ya le abra pasado), tengo un elemento div con un onMouseOut que lo que hace es ocultarlo al elemento div uando se produce el evento el tema es que dentro de mi div tengo anidados otros div mas y tambien se me oculta el el primer div cuando dentro de el a los demas div y lo que yo deseo es que se oculte cuando dejo el div (por decirlo asi) hacia fuera de el y no hacia adentro, espero me haya explicado y me puedan ayudar, disculpen mi ignorancia pero estoy dando mis primeros pasos e javascript. Saludos

aqui el codigo:

<div id="menu" onMouseOut="ocultarMenu()" style="position:absolute;">
<div class="opcion" onclick="javascript:funcion();">Mi funcion</div>
<div class="opcion" onclick="javascript:funcion();">Mi funcion</div>
<div class="opcion" onclick="javascript:funcion();">Mi funcion</div>
<div class="opcion" onclick="javascript:funcion();">Mi funcion</div>
</div>
  #2 (permalink)  
Antiguo 07/12/2010, 06:34
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Problemas con onMouseOut

lo he leído un par de veces y creo entender que el problema está en que cuando posicionas el ratón encima de cualquiera de los bloques que están dentro de menú, este se oculta. si es ese el problema, prueba a usar z-index en el menú contenedor
  #3 (permalink)  
Antiguo 07/12/2010, 10:13
 
Fecha de Ingreso: febrero-2009
Mensajes: 151
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Problemas con onMouseOut

Cita:
Iniciado por IsaBelM Ver Mensaje
lo he leído un par de veces y creo entender que el problema está en que cuando posicionas el ratón encima de cualquiera de los bloques que están dentro de menú, este se oculta. si es ese el problema, prueba a usar z-index en el menú contenedor
Hola IsaBelM muchas gracias por tu ayuda, el problema es exactamente el que dices, te comento que he probado con la solucion que sugieres pero sigue igual, hay alguna otra cosa que se pueda hacer. Saludos!
  #4 (permalink)  
Antiguo 07/12/2010, 10:54
 
Fecha de Ingreso: diciembre-2010
Ubicación: valencia
Mensajes: 203
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: Problemas con onMouseOut

si no quieres esconder el contenedor ¿pq le asocias el evento? yo usaria addEventListener y si la accion se a producido sobre una opcion hacer lo que quieras que haga.
  #5 (permalink)  
Antiguo 07/12/2010, 14:25
 
Fecha de Ingreso: febrero-2009
Mensajes: 151
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Problemas con onMouseOut

Cita:
Iniciado por enrique4480 Ver Mensaje
si no quieres esconder el contenedor ¿pq le asocias el evento? yo usaria addEventListener y si la accion se a producido sobre una opcion hacer lo que quieras que haga.
Hola Enrique gracias por tu interes, te comento que si quiero esconder el contenedor, pero quiero que se esconda cuando salgo de "el" (por decirlo de alguna forma) "hacia afuera", no cuando intento situarme dentro de los div que estan dentro del div menu. Por otro lado no veo como con addEventListener podria solucionar este problema. Saludos y gracias por cualquier ayuda que me puedan dar!

Última edición por dunga007; 07/12/2010 a las 14:33
  #6 (permalink)  
Antiguo 07/12/2010, 14:47
 
Fecha de Ingreso: diciembre-2010
Ubicación: valencia
Mensajes: 203
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: Problemas con onMouseOut

entonces tendras que verificar que el cursor se encuentra dentro del div que contiene las opciones. lo de addEventListener lo decia porque creia que no querias esconder el contenedor y que querias aplicarlo a las opciones, una pequeña confusion.

por ejemplo tu div se encuentra en las posiciones X 30 Y 50 , mientras el raton se encuentre ahi dentro no haces nada, una vez sale de ahi ocultas el div.
  #7 (permalink)  
Antiguo 07/12/2010, 15:09
 
Fecha de Ingreso: febrero-2009
Mensajes: 151
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Problemas con onMouseOut

Cita:
Iniciado por enrique4480 Ver Mensaje
entonces tendras que verificar que el cursor se encuentra dentro del div que contiene las opciones. lo de addEventListener lo decia porque creia que no querias esconder el contenedor y que querias aplicarlo a las opciones, una pequeña confusion.

por ejemplo tu div se encuentra en las posiciones X 30 Y 50 , mientras el raton se encuentre ahi dentro no haces nada, una vez sale de ahi ocultas el div.
Gracias nuevamente por responder Enrique, mira me tome la libertad de hacer una pequeña imagen



Creo que se explica por si sola el problema. Saludos!
  #8 (permalink)  
Antiguo 07/12/2010, 15:21
 
Fecha de Ingreso: diciembre-2010
Ubicación: valencia
Mensajes: 203
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: Problemas con onMouseOut

si y te vuelvo a repetir, si se ejecuta el evento y el raton continua dentro del div contenedor (dentro de sus coordenadas no dentro del div mismo ya que estas encima de otro) entonces no haces nada pq estas navegando por las opciones, caso contrario lo ocultas. otra forma es que si se sale fuera pero esta dentro de un div que pertenece a las opciones no hacer nada, caso contrario lo cierras.

Código Javascript:
Ver original
  1. function eve(e)
  2. {
  3.  if (e.srcElement.id=="uno")
  4.  {
  5.   if(!e.toElement.id)
  6.   {
  7.    alert("sales del div completamente");
  8.   }
  9.  }
  10. }
  11.  
  12. window.addEventListener("mouseout",eve,false);

aclaro que si el menu lo tienes dentro de otro div no te funcionara tal cual, en el ejemplo si pq la salida total se hace a HTMLBodyElement, si tu caso es otro solo tienes que cambiar la condicion, por ejemplo:

toElement.className no sea igual a las opciones.

Última edición por enrique4480; 07/12/2010 a las 15:43
  #9 (permalink)  
Antiguo 07/12/2010, 15:52
 
Fecha de Ingreso: febrero-2009
Mensajes: 151
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Problemas con onMouseOut

Cita:
Iniciado por enrique4480 Ver Mensaje
si y te vuelvo a repetir, si se ejecuta el evento y el raton continua dentro del div contenedor (dentro de sus coordenadas no dentro del div mismo ya que estas encima de otro) entonces no haces nada pq estas navegando por las opciones, caso contrario lo ocultas. otra forma es que si se sale fuera pero esta dentro de un div que pertenece a las opciones no hacer nada, caso contrario lo cierras.

Código Javascript:
Ver original
  1. function eve(e)
  2. {
  3.  if (e.srcElement.id=="uno")
  4.  {
  5.   if(!e.toElement.id)
  6.   {
  7.    alert("sales del div completamente");
  8.   }
  9.  }
  10. }
  11.  
  12. window.addEventListener("mouseout",eve,false);

aclaro que si el menu lo tienes dentro de otro div no te funcionara tal cual, en el ejemplo si pq la salida total se hace a HTMLBodyElement, si tu caso es otro solo tienes que cambiar la condicion, por ejemplo:

toElement.className no sea igual a las opciones.
He leido tu mensaje varias veces pero creo que no te entiendo bien o vos no a mi, yo tengo lo siguiente en el codigo:

<div id="menu" onMouseOut="ocultarMenu()" style="position:absolute;">
<div class="opcion" onclick="javascript:funcion();">Mi funcion</div>
<div class="opcion" onclick="javascript:funcion();">Mi funcion</div>
</div>

Cuando muevo el mose fuera del div "menu" se esconde (logicamente), pero tambien se esconde cuando muevo el mouse dentro de los 2 divs que estan dentro del div Menu y eso no quiero que ocurra, perdon si no te entiendo pero es que soy nuevo en javascripy y me lio un poco con todo esto. Saludos y gracias!!
  #10 (permalink)  
Antiguo 07/12/2010, 16:05
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Problemas con onMouseOut

Busca

cancelBubble

Quizá te sirva.

O pon eventos también en los 'divs' interiores, con una función que "aparezca" el contenedor. Dependiendo del caso, esto último puede ser más complicado
  #11 (permalink)  
Antiguo 07/12/2010, 16:25
 
Fecha de Ingreso: diciembre-2010
Ubicación: valencia
Mensajes: 203
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: Problemas con onMouseOut

Cita:
Cuando muevo el mose fuera del div "menu" se esconde (logicamente), pero tambien se esconde cuando muevo el mouse dentro de los 2 divs que estan dentro del div Menu y eso no quiero que ocurra, perdon si no te entiendo pero es que soy nuevo en javascripy y me lio un poco con todo esto. Saludos y gracias!!
solo tienes que poner en practica el ejemplo, creas 2 divs con id "uno" y otro con id "dos". el div uno contendra al div2 que simula ser una de tus opciones, observa el resultado.


si sales de tu div uno entrando a div dos (una opcion del menu) no se esconde, si sales fuera del div menu completamente te mostrara el alert, que es exactamente lo que quieres, detectar cuando se a salido y no cuando se

if (e.srcElement=="uno) // si el elemento es el div uno (el que contiene las opciones)

if (!e.toElement.id) //negacion, si no tiene id se a salido completamente.

otro ejemplo valido:

if(e.toElement.className!="className de las opciones)

en ese ultimo ejemplo hay que verificar tb que toElement no sea el propio menu, si no es el menu y tampoco las opciones por logica estas fuera.

te pongo un ejemplo entero para que veas que solo te da el alert al salir del div totalmente y no cuando te pones encima del otro.

Código HTML:
Ver original
  1.  
  2. function pp(e)
  3. {
  4.  if (e.srcElement.className=="uno")
  5.  {
  6.   if(!e.toElement.className)
  7.   {
  8.    alert("sales del div completamente ");
  9.   }
  10.  }
  11. }
  12.  
  13. window.addEventListener("mouseout",pp,false);
  14. .uno
  15. {
  16.  background-color: blue;
  17.  width: 300px;
  18.  height: 400px;
  19. }
  20.  
  21. .dos
  22. {
  23.  background-color: red;
  24.  width: 150px;
  25.  height: 200px;
  26. }
  27. </head>
  28. <div class="uno">
  29.  <div class="dos"></div>
  30. </div>
  31. </body>
  32. </html>

No me he parado a mirar compatibilidad con navegadores etc, eso lo haces tu pero son 2 lineas mas como aquel que dice.

Última edición por enrique4480; 07/12/2010 a las 16:56
  #12 (permalink)  
Antiguo 07/12/2010, 17:22
 
Fecha de Ingreso: febrero-2009
Mensajes: 151
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Problemas con onMouseOut

Cita:
Iniciado por enrique4480 Ver Mensaje
solo tienes que poner en practica el ejemplo, creas 2 divs con id "uno" y otro con id "dos". el div uno contendra al div2 que simula ser una de tus opciones, observa el resultado.


si sales de tu div uno entrando a div dos (una opcion del menu) no se esconde, si sales fuera del div menu completamente te mostrara el alert, que es exactamente lo que quieres, detectar cuando se a salido y no cuando se

if (e.srcElement=="uno) // si el elemento es el div uno (el que contiene las opciones)

if (!e.toElement.id) //negacion, si no tiene id se a salido completamente.

otro ejemplo valido:

if(e.toElement.className!="className de las opciones)

en ese ultimo ejemplo hay que verificar tb que toElement no sea el propio menu, si no es el menu y tampoco las opciones por logica estas fuera.

te pongo un ejemplo entero para que veas que solo te da el alert al salir del div totalmente y no cuando te pones encima del otro.

Código HTML:
Ver original
  1.  
  2. function pp(e)
  3. {
  4.  if (e.srcElement.className=="uno")
  5.  {
  6.   if(!e.toElement.className)
  7.   {
  8.    alert("sales del div completamente ");
  9.   }
  10.  }
  11. }
  12.  
  13. window.addEventListener("mouseout",pp,false);
  14. .uno
  15. {
  16.  background-color: blue;
  17.  width: 300px;
  18.  height: 400px;
  19. }
  20.  
  21. .dos
  22. {
  23.  background-color: red;
  24.  width: 150px;
  25.  height: 200px;
  26. }
  27. </head>
  28. <div class="uno">
  29.  <div class="dos"></div>
  30. </div>
  31. </body>
  32. </html>

No me he parado a mirar compatibilidad con navegadores etc, eso lo haces tu pero son 2 lineas mas como aquel que dice.
Hola Enrique, ahora voy entendiendo lo que me explicas, te comento que he probado el ejemplo que me pasas pero no funciona, ni en mozilla ni en internet explorer, sabras a que se debe?. Saludos!!
  #13 (permalink)  
Antiguo 07/12/2010, 17:50
 
Fecha de Ingreso: diciembre-2010
Ubicación: valencia
Mensajes: 203
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: Problemas con onMouseOut

en firefox usa:

Código Javascript:
Ver original
  1. if (!e) { e=window.event; }
  2.  alert(e.target.className);


puedes verificar tu mismo, si es undefined es que no existe, solo te puse el ejemplo como orientacion. yo lo he probado en chrome y epiphany.
  #14 (permalink)  
Antiguo 08/12/2010, 02:23
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Problemas con onMouseOut

@furoya;
cancelBubble, o lo mismo que stopPropagation en el modelo estandar, no funcionaría porque los antes mencionados son para controlar la propagación del evento por los elementos. no es lo mismo que controlar que elementos disparan el evento. si no se tiene buen conocimiento acerca del modelo de evento, este concepto podría ser complicado entenderlo.

@dunga007;
¿no te has parado a pensar que hubiera sido más fácil si desde un principio mostraras el código javascript que te causa problema? el problema no es tan trivial. si recien te inicias en el tema de los eventos, es comprehensible que te encuentres con situaciones raras. te invito a que leas un buen material acerca de los eventos para que puedas comprender como es que realmente funciona. los conceptos principales que debes adquirir son:
  • que son los listener
  • que es el objeto event
  • como viaja el objeto event por los elementos

tu problema debe venir por las propiedades que estas utilizando para identificar el elemento a tratar. dicha propiedad va cambiando de valor a la vez que su contenedor (objeto event) se genera en distintos eventos. por otro lado, los eventos del raton (especialmente mouseover y mouseout) se disparan uno detrás del otro. cuando ocurre mouseout le sigue mouseover en un nuevo elemento, independientemente si estos estan anidados.

el siguiente código es una reproducción básica donde cada vez que suceden los eventos se crea un registro temporal de cual elemento inicio el evento y cual tipo de evento generó. notese el efecto bizarro que tiene en firefox. en iexplorer8 y anteriores no va funcionar porque dicho navegador utiliza una interfaz distinta al estandar. la porcion en color rojo es el código "ofensivo". luego cambielo por this. y finalmente, sería más cómodo si lo hicieras completamente en CSS, pero ya ese tema no va aquí. en el foro de css encuentras multitud de temas relacionado a este efecto.
Código:
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<!-- saved from url=(0014)about:internet -->
<html xmlns='http://www.w3.org/1999/xhtml'><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Test Development</title>
<script type='text/javascript'>
function profileEvent(event){
var ul = document.body.lastChild, li = ul.insertBefore(document.createElement("li"), ul.firstChild);
li.appendChild(document.createTextNode(event.target.nodeName +": "+ event.type));
setTimeout(function(){li.parentNode.removeChild(li);}, 2000);
}

self.onload = function(){
document.body.firstChild.onmouseover = function(event){
event.target.firstChild.style.display = 'block';
profileEvent(event);
}

document.body.firstChild.onmouseout = function(event){
event.target.firstChild.style.display = '';
profileEvent(event);
}
}
</script>
<style type='text/css'>
div{
background-color:hsla(0, 100%, 50%, .2);
padding:1em;
width:10em;
} div > ul{
background-color:rgba(128,128,255,.2);
display:none;
margin:0;
padding:0;
} li{
background-color:rgba(255,255,0,.2);
list-style:none;
margin:1em;
padding:.25em;
border-radius:.25em;
} div + ul{
display:block;
position:absolute;
top:0;
left:14em;
} div + ul li{
margin:.25em;
padding:.25em;
}
</style>
</head>

<body><div><ul><li>list 1</li>
<li>list 2</li>
<li>list 3</li></ul>
container & event</div>
<ul></ul></body></html>
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #15 (permalink)  
Antiguo 09/12/2010, 13:18
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Problemas con onMouseOut

Cita:
cancelBubble, o lo mismo que stopPropagation en el modelo estandar, no funcionaría porque los antes mencionados son para controlar la propagación del evento por los elementos. no es lo mismo que controlar que elementos disparan el evento. si no se tiene buen conocimiento acerca del modelo de evento, este concepto podría ser complicado entenderlo.
Sí, bueno, tampoco es para tanto, por eso sugerí que le diera una mirada. Lo que me olvidé es que era propietario, y que cambió el "nombre" en el estándar.

Y es cierto, lo que dunga007 quiere se parece a la propagación de un evento, pero no es. Además, la cadena se produce hacia afuera, y aquí hay que evitar que el menú se oculte al moverse hacia adentro.

La verdad es que si no le hubiese pifiado, ni volvía. Ya que estoy, pongo el ejemplo del otro método que propuse

Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>.</title>
<script>

function ocultarMenu(T){
T.style.visibility = "hidden";
}

function muestraMenu(T){
document.getElementById('menu').style.visibility = 'visible';
}

function funcion(){
alert("Hola!");
}
</script>

<style type="text/css">
.opcion {background-color: lime; cursor: pointer;}
</style>
</head>
<body>
<h2>... </h2>

<div id="menu" onMouseOut="ocultarMenu(this)" 
/*onMouseOver="muestraMenu(this)" */
style="position:absolute; background-color: yellow; 
top: 14em; height: 7em;"> 
<div class="opcion" onmouseover="muestraMenu()" onclick="javascript:funcion();">Mi funcion</div> 
<div class="opcion" onmouseover="muestraMenu()" onclick="javascript:funcion();">Mi funcion</div>
<div class="opcion" onmouseover="muestraMenu()" onclick="javascript:funcion();">Mi funcion</div>
<div class="opcion" onmouseover="muestraMenu()" onclick="javascript:funcion();">Mi funcion</div>
</div>

<button onclick = "muestraMenu()"> Mostrar</button>

<p>El área amarilla se toma como "fuera del <tt>div</tt>". 
Esto se puede corregir agregando otro evento a cada 
"opcion" o habilitando el <tt>onMouseOver="muestraMenu(this)"</tt>.
</body>
</html>
Y también uno de cancelBubble, para que se entienda cómo se repite el evento "hacia arriba".

Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">

<script>
function saleSpan(){
window.event.cancelBubble = true; //false;

alert("sale de span")
}

function saleDiv(){
alert("sale de div");
}
</script>

<style type="text/css">

</style>
</head>
<BODY>

<div onmouseout="saleDiv()" style="height: 6em; 
width: 12em; background: red;">
<span onmouseout="saleSpan()" style="background: lime;">
QWERTYUIOP</span>
</div>

<p>Los mensajes de alerta se cierran con la tecla [Esc] 
para no cambiar la posición del puntero, y así probar la 
secuencia de eventos.<br>
En la función <tt>saleSpan()</tt> se cambia entre 
<tt>false</tt> y <tt>true</tt> para que el evento pase al 
<tt>div</tt> o no. </p>
</body>
</html>

De última, IExplorer lo resolvió con un evento propietario, pero no sé cuál es su equivalencia en otros navegadores.

Código:
<div onmouseleave ="
alert('Sale hacia afuera del div, no hacia adentro. (¿Se entiende?)')
" style="height: 6em; width: 12em; background: red;">
<span style="background: lime;">
QWERTYUIOP
</span>
</div>
  #16 (permalink)  
Antiguo 09/12/2010, 13:44
 
Fecha de Ingreso: noviembre-2010
Mensajes: 66
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Problemas con onMouseOut

podrias cambiar el onmouseout de la primera div por onclick y entonces el menu desaparecera cuando selecciones una funcion (las div "mi funcion") y te ahorrarias tener que cambiar todo el codigo, aunque no se si es eso lo que realmente buscas.
  #17 (permalink)  
Antiguo 10/12/2010, 13:52
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Problemas con onMouseOut

Cita:
Iniciado por Joselitro Ver Mensaje
podrias cambiar el onmouseout de la primera div por onclick y entonces el menu desaparecera cuando selecciones una funcion (las div "mi funcion") y te ahorrarias tener que cambiar todo el codigo, aunque no se si es eso lo que realmente buscas.
Lejos, la mejor respuesta.

Lo que yo le agregaría es un botón para cerrar ( y ya que estamos, una barra de sistema simulada con botones de 'mover' y 'fijar', como para justificarla ). Sería por si alguien se arrepiente y no elige ninguna opción.

Etiquetas: onmouseout
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:02.