El Blog de Óscar Sotorrío Sánchez - MCP Application Development Foundation - C#

Todo lo que vaya aprendiendo de .NET, C#, ASP.NET, SQL Server, etc, lo compartiré con vosotros.

El autor:

Óscar Sotorrío Sánchez
Contacto Send mail

Encuéntralo

Álguien dijo...


No puedes olvidar, pero puedes intentar perdonar. Y posiblemente nunca te perdones por haberlo intentado.

OSS

Cuidado con los eventos onmouseover y onmouseout

Los eventos de JavaScript onmouseover y onmouseout son muy caprichosos y dependiendo del explorador que utilicemos para ver la página, se comportarán de una forma o de otra.

Para comprender mejor como se comportan estos eventos he realizado un sencillo ejemplo de menú despleglable típico de JavaScript. Podéis ver el ejemplo aquí.

Os aconsejo que dediquéis unos segundos en ver el código fuente del ejemplo. Como pedéis apreciar, la página esta dividida principalmente en 3 elementos <div> que resumo a continuación.

 

- id="interfaz", es el bloque principal que se muestra al usuario.

- id="MenuError", es el menú desplegable que no funciona correctamente (ahora veremos porqué).

- id="MenuOK", es el menú desplegable que funciona correctamente.

 

En la página del ejemplo hay dos iconos como este  . El icono de la izquierda mostrará el menú que funciona y el icono de la derecha mostrará el que no funciona correctamente.

Antes de explicar porque no funciona el menú del icono de la derecha, vamos a ver que acciones hemos realizado para darle la funcionabilidad esperada.

 

1- Hemos marcado con position:absolute tanto el objeto interfaz como el objeto MenuError.

2- También hemos marcado al objeto MenuError con display:none. Para que de forma predeterminada no se muestre el menú desplegable.

3- En el evento onmouseover de la imagen del icono de la derecha hemos llamado a la función MostrarMenu(id). Esta función lo único que hace es cambiar el atributo display para que se muestre el menú y darle una posición donde mostrarse.

4- En el evento onmouseout del objeto MenuError hemos llamado a la función OcultarMenu(). Con la intención de que si salimos con el ratón del area del menú, este debería ocultarse.

 

Bien, con esto todo debería funcionar correctamente. Si colocamos el ratón sobre el icono de la derecha estamos llamando a MostrarMenu(id) y el menú se muestra. Y cuando salimos del area del menú, estamos llamando a OculatarMenu() y el menú debería ocultarse.

Ahora dirijase a la página del ejemplo y coloque el ratón sobre el icono de la derecha he intente hacer click sobre una de las opciones del menú. ¿Que ocurre?. El menú se oculta cuando el ratón se coloca sobre el area del menú, o al menos, eso parece. ¿Porque?.

Lo que sucede es que cuando "paseamos" el ratón por el menú para llegar hacer click por ejemplo en la opción 1, estamos entrando y saliendo en varios objetos. Estos objetos son hijos del menú, o mejor dicho, del objeto padre <div> "MenuError".

Cuando salimos por ejemplo del primer <tr>, automaticamente se dispara al evento onmouseout del padre, y por lo tanto se llama a la función OcultarMenu(). Este es el comportamiento caprichoso al que me refería al principio y al parecer es el comportamiento predeterminado en el DOM.

¿Como solucionarlo?.

 

5- En el evento onmouseover del objeto MenuOK hemos llamado a la función MostarMenu(id).

 

Logicamente si cuando entro en un objeto hijo también se llama al evento onmouseover del padre, puedo aprovecharme de ello, llamando a MostrarMenu(id). De esta forma, después de todo el paseo de entrar y salir de los distintos objetos hijos (tr, td, img, etc), me aseguro que la última acción realizada será entrar en el elemento que contiene la opción 1 (o la opción 2) y por lo tanto estaremos disparando el evento onmouseover del padre que llama a MostrarMenu(id).

Comprobar que en el menú que se despliega con el icono de la izquierda podéis hacer click sobre las opciones del menú. Fijaros que la única diferencia en el código con este menú y el que no funciona es haber incluido onmouseover="MostarMenu('MenuOK');" en el objeto <div>.


Tags:
Categories: Desarrollo Web
Posted by Oscar.SS on sábado, 15 de agosto de 2009 1:11
Permalink | Comentarios (0) | Post RSSRSS comment feed

Ejercicio de JavaScript: Acceder a los script de otras ventanas.

El enunciado de este sencillo ejercicio podría ser el siguiente:

Desde una ventana padre abrir una ventana hijo y mostrar en esta el contenido de una cadena definida en el script de la ventana padre. Pasado un retardo de 3 segundos, desde la ventana padre cambiar el contenido de una cadena definida en la ventana hijo y mostrar el contenido en esta ventana.

Creerme que es mucho más fácil de lo que parece por el enunciado. Lo que sucede, muy amenudo, es que es más sencillo ver el código que explicarlo con mil palabras.

Primero voy a mostrar los script con las funciones que realizan estas tareas y luego pasaremos a la explicaciones.

Este es el script que hay que colocar en la ventana primaria o padre:


<script type="text/javascript">

var strPadre "Esta cadena esta definida en la ventana padre.";

var 
nuevaVentana;

function 
abrirVentana()
{
    nuevaVentana 
= window.open("subVentana.html","nuevaVentana","status,height=200,width=300");
    
setTimeout("cambiarVariable()",3000);
}    

function cambiarVariable()
{
    nuevaVentana.strHijo 
"He cambiado la variable de la ventana hijo desde la ventana padre con un ratardo.";
    
nuevaVentana.document.write(nuevaVentana.strHijo);
}

abrirVentana()
;

</script>

Y este es el script de la ventana secundaria:


<script type="text/javascript">

var strHijo;

function 
mostrarCadena()
{
    strHijo 
opener.strPadre;
    window
.document.write(strHijo);
}

mostrarCadena()
;

</script>


Fijemos nuestra atención sobre la función "abrirVentana()". Aquí abrimos la ventana hijo guardando una referencia de la misma en la variable de ámbito global "nuevaVentana". A continuación llamamos con un retraso de 3 segundos a la función "cambiarVariable()".

En la función "cambiarVariable()" nos aprovechamos de que la variable "nuevaVentana" guarda una referencia a la ventana hijo para cambiar el contenido de la variable strHijo que está definida en la ventana hijo.

En el script de la ventana hijo tenemos la función "mostarCadena()", por medio de la propiedad "opener", que contiene una referencia a la ventana que ejecuta la función "window.open()", podemos acceder al contenido de la variable strPadre y mostrarla por pantalla.


Tags:
Categories: Desarrollo Web
Posted by Oscar.SS on sábado, 10 de enero de 2009 13:18
Permalink | Comentarios (1) | Post RSSRSS comment feed