DHTML : Librerías : Menús desplegables

Parte III: Opciones avanzadas de la librería menu.js

En los capítulos anteriores describimos la forma de implementar menús desplegables con DHTML dinámico, utilizando la librería menu.js. Ahora vamos a profundizar en algunos aspectos avanzados que permiten sacar el máximo patido a las funcionalidades contenidas en menu.js.

Si todavía no has leido la primera y segunda parte de esta explicación, te recomendamos que lo hagas:

Te recordamos que la definición de los menús (función onLoad) debe realizarse entre las etiquetas <head> y </head>. Además, para que los menús funcionen correctamente con la versión 5 del navegador Microsoft Internet Explorer, es necesario añadir entre las etiquetas <html> y </html> el siguiente código:

<script language="javascript1.2">
//CARGA MENUS PARA IE5
if (document.all) {
    onLoad()
}
</script>

1. Creación de prototipos de estilos

En el capítulo 2 de esta explicación (Creación de submenús y adaptación de su aspecto) se describe cómo modificar el aspecto de los menús. Cuando dentro de un sitio se utilizan diferentes menús desplegables, el método descrito requiere muchas líneas de código, puesto que hay que repetir cada asignación de estilo para cada menú.

La librería menu.js define un mecanismo de creación de prototipos que nos permite asignar un conjunto de estilos por defecto para la creación de los diferentes menús del site. Veamos un ejemplo:

<script language="JavaScript1.2">
<!--
function onLoad() {
    window.menuA = new Menu()
    menuA.addMenuItem("Taller de JS", "location='taller.html'")
    menuA.addMenuItem("Taller de DHTML", "location='tallerdhtml.html'")

    window.menuB = new Menu()
    menuB.addMenuItem("Explicación I", "location='explmenus1.html'")
    menuB.addMenuItem("Explicación II", "location='explmenus2.html'")

    menuA.fontColor = "red"
    menuA.menuHiliteBgColor = "green"
    menuA.menuItemBgColor = "yellow"

    menuA.prototypeStyles = menuA

    menuA.writeMenus()
}
//-->
</script>

 

Como se puede observar, la creación del prototipo se basa en la asignación del objeto menú cuyos estilos se quieren utilizar como estilos por defecto a la propiedad prototypeStyles. Veamos como quedan nuestros menús:

Menu A (toma los estilos del prototipo)
Menu B (prototipo)

2. Diferentes formas de mostrar los menús

Los menús creados utilizando esta librería son objetos basados en CSS (Cascade Style Sheets, Hojas de Estilo en Cascada). Por ello, pueden mostrarse y ocultarse utilizando la propiedad visibilty. Para simplificar este mecanismo, existen dos métodos (showMenu() y hideMenu()), que pueden utilizarse para mostrar y ocultar los menús.

La función showMenu() recibe como argumento el objeto menú que se desea visualizar. Por defecto, el menú se muestra en la posición donde se encuentre el puntero del ratón. Esta configuración puede modificarse pasándole a la función showMenu() la coordenada X de la posición horizontal donde queremos que aparezca el menú. La coordenada para la posición vertical será la de la posición del puntero del ratón:

<a href="javascript://"
onClick="window.showMenu(window.menuA, 10)">
Menú A (a 10 pixels del borde izquierdo)</a>

Para ver el resultado de mostrar el menú de la forma anterior, sigue el siguiente enlace:

Menú A (a 10 pixels del borde izquierdo)

En el ejemplo anterior hemos utilizado el evento onClick para capturar la pulsación sobre el enlace y lanzar la visualización del menú. Podemos utilizar el evento onMouseOver para crear menús con un comportamiento más propio de una página web. De este modo, conseguiremos que el menú se muestre cuando el puntero del ratón pase sobre el enlace:

<a href="javascript://"
onMouseOver="window.showMenu(window.menuA)">
Menú A (usando onMouseOver)</a>

El resultado se puede ver en este ejemplo:

Menú A (usando onMouseOver)

Pueden utilizarse otros tipos de eventos, como los nuevos eventos de JavaScript 1.2 (DblClick, DragDrop, KeyDown, KeyPress, KeyUp, MouseDown, MouseMove, MouseOut, MouseUp, Move o Resize).

En cuanto a la ocultación de los menús, no es necesario preocuparse de realizarla. La librería menu.js establece el método hideMenu() para ocultar los menús y lo lanza cuando el usuario mueve el puntero del ratón fuera de la superficie del menú (utilizando el envento onMouseOut). También se utiliza el evento onMouseUp para invocar hideMenu() cuando se pulsa el botón derecho del ratón fuera del menú. Se puede cambiar este comportamiento creando nuevos gestores de evento para estos eventos.

3. Compatibilidad con los navegadores

Los navegadores de Netscape y de Microsoft soportan diferentes Modelos de Objetos del Documento (DOMs) (ver el capítulo El Modelo de Objetos del Documento de nuestra sección de JavaScript Avanzado). La librería menu.js lo tiene en cuenta.

Para saber qué navegador está utilizando el usuario no se recurre a las propiedades del objeto navigator (appName y appVersion). Se utiliza en cambio la detección de objetos, basado en el hecho de que si un objeto existe al evaluarlo devuelve verdadero, y falso en caso contrario. De este modo, para saber si hay que usar el objeto layers (propio de Netscape) o el objeto all (propio de Microsoft) se usa:

if (document.layers) {
//codigo que usa el objeto layers
}
else if (document.all) {
//codigo que usa el objeto all
}

 

NOTA:
El código original de este menú desplegable estaba publicado en la página DevEdge, de Netscape. Desde Octubre de 2004, esta web de soporte a desarrolladores ha dejado de estar accesible.

 

{ Menús desplegables }