Comunidad de diseño web y desarrollo en internet online

Consulta propagacion evento keyUp

Citar            
MensajeEscrito el 23 Sep 2009 07:52 am
Ejecutando este pequeño codigo de abajo, y luego haciendo click en el boton del centro, aparece una ventana Alert de bienvenida.

Ahora bien,... es muy comun en casi toda aplicacion que ante cualquier ventana de aviso similar el usuario opte por usar la tecla Escape para cerrarla luego de leido el aviso/mensaje/etc. Es una accion automatica al que muchos usuarios estan acostumbrados.
Mi problema es, como hacer para permitirle al usuario cerrar las ventanas de Alert con la tecla Escape sin que esta accion sea capturada por el evento keyUp de la aplicacion, que esta "por debajo" de la ventana Alert.

Esta pequeña aplicacion es una simplificacion de un problema que tengo con otros desarrollos, donde necesito capturar la tecla Escape en algun momento de la aplicacion, en algun TitleWindow, etc, PERO NO ante una ventana de Alert.
La primera vez que se presione escape se tiene que cerrar el Alert, pero no propagarse inmediatamente hacia atras. Salvo que una vez cerrado la ventana Alert se presione de nuevo la tecla Escape, y ALLI SI debe responder la aplicacion/TitleWindow/etc, claro.
Si a alguien se le presentó alguna vez la misma situacion sabra entender a que me refiero en cuanto a esta forma de operacion de una aplicacion cualquiera.
Saludo

Código Flex :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application keyUp="if (event.keyCode==27) Alert.show('tecla ESC capturada por la Aplicacion');" xmlns:mx="http://www.adobe.com/2006/mxml">
   <mx:Script>
      <![CDATA[
         import mx.controls.Alert;
      ]]>
   </mx:Script>
   <mx:Button click="Alert.show('Bienvenido')" label="Button"/>
</mx:Application>

Por marianoayesse

6 de clabLevel



 

opera
Citar            
MensajeEscrito el 23 Sep 2009 01:09 pm
Los Listeners se agregan a un evento en el orden en que son declarados, e incluso tienes un parámetro de prioridad que puedes usar para que alguno tenga preferencia sobre otros. Además, la clase Event tiene métodos stopPropagation o stopInmediatePropagation que permite cancelar la propagación de un evento hacia el resto de la cadena de listeners

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 24 Sep 2009 07:21 am
Exacto Jorge. Pero el asunto es que los Alert son un caso especial.
¿Como le agrego un listener de keyup al Alert?
Busque la forma y no le encontré. Si pudiese agregarle un listener podria detener la propagacion, como bien tu dices.
Entonces la cuestion queda en: ¿Como le agrego un listener de keyup al Alert?

Por marianoayesse

6 de clabLevel



 

opera
Citar            
MensajeEscrito el 24 Sep 2009 08:35 am
No sé si te servirá agregarle un listener. He encontrado una solución no demasiado ortodoxa que es usar una variable (la he llamado "close", esa variable la hago true cuando se cierra un alert y la hago false cuando le doy un click. En la función upKey compruebo el valor de la variable....puff, mejor en código para que veas lo que he hecho, aunque no me parece la solución más ortodoxa del mundo mundial :(

Código ActionScript :

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application creationComplete="init()" xmlns:mx="http://www.adobe.com/2006/mxml"> 
   <mx:Script> 
      
<![CDATA[  
       import flash.events.MouseEvent;
         import mx.controls.Alert; 
       import flash.events.KeyboardEvent;
       import mx.core.Application;
       import mx.events.CloseEvent;

       private var close:Boolean;
       
       private function init():void {
          application.addEventListener(KeyboardEvent.KEY_UP, upKey);
       }
       public function upKey(e:KeyboardEvent):void {
         if (e.charCode==27){
            if (close) {
               close = false;
            }else{
               Alert.show("keyup, keycode: " + e.currentTarget + " " + e.target);
            }
         }
         
      }
      public function buttonClick(e:Event):void {
           var alert:Alert = Alert.show("Bienvenido", "", 0x4, null, alert_close);
         alert.addEventListener(MouseEvent.CLICK,alert_click)
       }
      public function alert_close(e:CloseEvent):void{
         close = true;
      }
      public function alert_click(e:MouseEvent):void{
         close = false;
      }
]]>
 
   </mx:Script> 
   <mx:Button id="miboton" click="buttonClick(event)" label="Button"/> 
</mx:Application> 

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Sep 2009 04:29 pm
Esta perfecto Eliseo. El ejemplo que pasaste es un poco mas sencillo del que estuve mas o menos imaginando como solucion de ultima instancia. Voy a adaptarlo y usarlo porque no hay otra alternativa por lo visto. Solo voy a cambiar la linea
application.addEventListener(KeyboardEvent.KEY_UP, upKey);
por
application.addEventListener(KeyboardEvent.KEY_UP, upKey, true);
para que el listener funcione en la etapa de captura.
Saludo

Por marianoayesse

6 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.