Foros del Web » Programando para Internet » Jquery »

Menu + Submenu + MouseOver + MouseOut + JQUERY + PROBLEMA

Estas en el tema de Menu + Submenu + MouseOver + MouseOut + JQUERY + PROBLEMA en el foro de Jquery en Foros del Web. Buenas tardes a tod@s. Tengo un problema, el cual, seguro que es de "principiante" pero no doy con ello.. Os pongo en situación... Tengo un ...
  #1 (permalink)  
Antiguo 18/09/2008, 13:49
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 7 meses
Puntos: 10
Menu + Submenu + MouseOver + MouseOut + JQUERY + PROBLEMA

Buenas tardes a tod@s.

Tengo un problema, el cual, seguro que es de "principiante" pero no doy con ello..

Os pongo en situación...

Tengo un menú vertical.
Cita:
Opcion 1
Opcion 2
Opcion 3
Opcion 4
En el menú, 1 opción, tiene un Submenú.
Cita:
Opcion 1
__Subopcion 1
__Subopcion 2
_-Subopcion 3
Opcion 2
Opcion 3
Opcion 4
Ese Submenú, se abre debajo (es un UL general, y el LI primero, contiene otro UL (con el submenú).


En el texto de OPCION 1, tenemos evento OnmouseOver (para abrir el submenú) y evento onMouseOut (para cerrar el submenú).

Mi problema es que si el ratón lo muevo HACIA ABAJO (queriendo entrar en el SUBMENÚ, salta el evento onMouseOut del botón, y se CIERRA el submenú...

No se si me he explicado u os he liado.

A ver quién puede aportarme alguna idea para aclararme.

PD: en el titulo de este post pongo JQUERY (la apertura y cierre la estoy haciendo con la función de colapsado de JQUERY)

Gracias de antemano.

Un saludo.

Javier
  #2 (permalink)  
Antiguo 18/09/2008, 14:10
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Menu + Submenu + MouseOver + MouseOut + JQUERY + PROBLEMA

Prueba con onclick en vez de onmouseover, y luego una función que cierre los menús abiertos.
Si no puedes poner una variable true/false al entrar en el submenú, que si es true el submenú no se cierra y si es false el submenú se cierra (en onmouseout).
Prueba y me cuentas.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #3 (permalink)  
Antiguo 19/09/2008, 02:40
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 7 meses
Puntos: 10
Respuesta: Menu + Submenu + MouseOver + MouseOut + JQUERY + PROBLEMA

Buenos días CHuLoSoY


En primer lugar, cambiar el evento y usar onClick es la solución fácil, la cual mi cliente no quiere

En segundo lugar, a pesar de usar flag's de control (variables a true o false) sigo estando en el mismo problema.

Ejemplo:

Al poner el ratón encima de mi opción principal (opcion 1) pongo mi flag de control a var cerrarSubmenu = false;

Entonces, al realizar el onMouseOut de la opción principal, como cerrarSubmenu == false, NO cierro el submenú

Pero... ¿y si mi acción está siendo SACAR EL RATÓN POR ARRIBA, FUERA DEL MENÚ?
Se tendría que cerrar el submenú, pero como mi flag de control me indica que no.. pues no se cierra...

¿me entiendes?

Por favor, ¿alguien que pueda aportarme alguna idea, ejemplo, o algo?

Muchas gracias de antemano.

Un saludo.

Javier
  #4 (permalink)  
Antiguo 19/09/2008, 06:29
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Respuesta: Menu + Submenu + MouseOver + MouseOut + JQUERY + PROBLEMA

Ya que hablás de jquery, te interesará la solución de su creador: http://ejohn.org/apps/jselect/event.html

Aunque la función que usa para añadir los eventos es bastante mala, como él mismo admite en algún lado, puede mejorarse con algo como esto:
Código PHP:
function addEvent(elmevTypefnuseCapture) {
    if (
elm.addEventListener) {
        
elm.addEventListener(evTypefnuseCapture);
    }
    else if (
elm.attachEvent) {
        var 
f=function(){
            
fn.call(elm,window.event);
        }
        
elm.attachEvent('on' evTypef);
    }
    else {
        throw 
'Su navegador no soporta asignación de eventos vía DOM';
    }

El problema radica principalmente en que los eventos del mouse tienen como blanco los objetos que están más abajo en la jerarquía del dom y es difícil identificar cuál es el que dispara los eventos usando evento.target o event.srcElement., por lo que las versiones de addEvent presentadas, al admitir el uso de this para referenciar el objeto, ayudan bastante en la tarea. (De esto hablamos bastante aquí: http://www.forosdelweb.com/f13/quien...uncion-621642/)

Hay otras maneras de solucionarlo. Si te armás de paciencia, encontrarás interesante este post: http://www.forosdelweb.com/f13/probl...evento-616867/
  #5 (permalink)  
Antiguo 19/09/2008, 07:24
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 7 meses
Puntos: 10
Respuesta: Menu + Submenu + MouseOver + MouseOut + JQUERY + PROBLEMA

Hola Panino5001

Gracias por tu aportación.

Mira.. si te descargas este ejemplo que me has pasado, y te quedas con la parte correspondiente al listado del menú, los CSS y el Javascript, todo funciona correctamente, ¿ok?

Entonces...

Si aplicamos en el despliegue del menú y en el cierre la función de JQUERY sildeToogle, puedes ver que no funciona correctamente (se pierden los eventos y se abre y cierra el submenú constantemente.

Te pongo el ejemplo para que veas lo que te digo...

Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html>
<
head>
<
title>addEvent() recoding contest entry</title>
<
script src="jquery.js" type="text/javascript"></script>
<script type="text/javascript">

/* WRITE THESE FUNCTIONS */

function addEvent( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj["e"+type+fn] = fn;
    obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
    obj.attachEvent( "on"+type, obj[type+fn] );
  } else
    obj.addEventListener( type, fn, false );
}
function removeEvent( obj, type, fn ) {
  if ( obj.detachEvent ) {
    obj.detachEvent( "on"+type, obj[type+fn] );
        obj[type+fn] = null;
  } else
    obj.removeEventListener( type, fn, false );
}

/* DON'T TOUCH THESE FUNCTIONS */

addEvent(window,"load",init);

function init()
{
    var x = document.getElementById('navigation').getElementsByTagName('li');
    for (var i=0;i<x.length;i++)
    {
        addEvent(x[i],"mouseover",showSubNav);
        addEvent(x[i],"mouseout",hideSubNav);
        addEvent(x[i],"mouseover",showBorder);
        addEvent(x[i],"mouseout",hideBorder);
    }
}

function removeBorders()
{
    var x = document.getElementById('navigation').getElementsByTagName('li');
    for (var i=0;i<x.length;i++)
    {
        removeEvent(x[i],"mouseover",showBorder);
        removeEvent(x[i],"mouseout",hideBorder);
    }

}

function showSubNav(e)
{
//    this.className += ' over';
    jQuery("#" + "submenu_" + this.id).slideToggle("fast");
}

function hideSubNav(e)
{
//    this.className = this.className.replace(/over/g,'');
    jQuery("#" + "submenu_" + this.id).slideToggle("fast");
    noBubble(e);
}

function showBorder(e)
{
    this.className += ' current';
}

function hideBorder(e)
{
    this.className = this.className.replace(/current/g,'');
    noBubble(e);
}

function noBubble(e)
{
    if (e && e.stopPropagation)
        e.stopPropagation();
    else
        window.event.cancelBubble = true;
}

</script>
<style type="text/css">
<!--

ul#navigation {
    width: 150px;
}

li {
    border: 1px solid #ffffff;
}

li ul {
    display: none;
}

li.over ul {
    display: block;
}

li.current {
    border-color: #cc0000;
}

-->
</style>

</head>

<body>

<h1><code>addEvent()</code> recoding contest entry</h1>

<ul id="navigation">
    <li id="menu1"><a href="#">Item 1</a>
        <ul id="submenu_menu1">
            <li><a href="#">Item 1.1</a></li>
            <li><a href="#">Item 1.2</a></li>
            <li><a href="#">Item 1.3</a></li>
        </ul>

    </li>
    <li id="menu2"><a href="#">Item 2</a>
        <ul id="submenu_menu2">
            <li><a href="#">Item 2.1</a></li>
            <li><a href="#">Item 2.2</a></li>
            <li><a href="#">Item 2.3</a></li>

        </ul>

    </li>
    <li id="menu3"><a href="#">Item 3</a>
        <ul id="submenu_menu3">
            <li><a href="#">Item 3.1</a></li>
            <li><a href="#">Item 3.2</a></li>
            <li><a href="#">Item 3.3</a></li>

        </ul>

    </li>
</ul>

</body>
</html> 
Si te fijas en la parte de Javascript, he comentado las acciones que ocultan y muestran el menú, y debajo, he puesto las llamadas a JQUERY para que haga el efecto deseado.

si tienes un hueco, échale un ojo y a ver qué me puedes comentar.

Un saludo.

PD: descárgate o usa la librería JQUERY que tengas (yo a mi objeto $ lo he denominado jQuery

A ver que me puedes contar!!!

Javier
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 13:00.