Simular un evento en AS3

Publicado por Iván Gajate el 11 de noviembre de 2008 en AS3, Flash, Tutoriales

La gestión de eventos de AS3 es muy buena, aunque a veces nos obliga a estar demasiado «encorsetados» en el trabajo día a día.

Algo que es muy común es poner un botón con su listener y una función detectora del evento, que recibe un parámetro de tipo MouseEvent:

import flash.events.MouseEvent;

miBoton.addEventListener(MouseEvent.MOUSE_DOWN, miOnMouseDown);

function miOnMouseDown(evento:MouseEvent):void{
	trace("Boton pulsado!!");
}

Hasta aquí todo guay. El problema viene cuando queremos llamar a esa función directamente, sin haber pulsado el botón, por ejemplo si queremos simular la acción del usuario o ejecutar el código de miOnMouseDown nada mas entrar en la sección. Nuestra función espera un evento de tipo MouseEvent como parámetro, y si hacemos la llamada sin ese parámetro nos dará un error al compilar.

La solución pasa por pasarle un parámetro de tipo MouseEvent construido por nosotros mismos:

miOnMouseDown(new MouseEvent(MouseEvent.MOUSE_DOWN));

Lo que hemos hecho es utilizar el constructor del evento MouseEvent, pasándole como parámetro un String con el nombre del evento, en este caso «mouseDown«, que se esconde bajo MouseEvent.MOUSE_DOWN.

Esto es muy útil para el evento Resize, una función que se ejecutará cada vez que se redimensione nuestra película, colocando todos los elementos en su posición correcta, pero conviene hacer una llamada a dicha función al comenzar la película para que se ejecute la acción y todos los elementos se posicionen desde un primer momento.

import flash.events.Event;

stage.addEventListener(Event.RESIZE, miOnResize)

function miOnResize(evento:Event):void{
	// Posiciono los elementos de mi escenario...
}

Ahora podemos hacer una llamada a la función, para que se desencadene el evento

miOnResize(new Event(Event.RESIZE));

Por supuesto también podemos hacernos una función auxiliar para rodear el problema, pero esta me parece una solución fácil y rápida para muchos casos.

Además, en algunos constructores de eventos, nos permiten enviar mas parámetros al constructor además del nombre del evento, con lo que podemos simular por ejemplo que el deslizador de un componente Slider ha sido arrastrado hasta cierta posición y que se desencadenen sus eventos.

Ampliación: Me dice mi compañero Isra que también se puede poner el evento a null como valor por defecto en el listener, con lo que podemos enviarle el evento, o no, siempre y cuando no necesitemos ninguna propiedad del evento dentro de nuestra función claro. Gracias Isra! 😉

Ahora esto no da error:

import flash.events.Event;

stage.addEventListener(Event.RESIZE, miOnResize)

function miOnResize(evento:Event=null):void{
	// Posiciono los elementos de mi escenario...
	trace("Llamada a la función sin enviar ningún evento")
}

miOnResize();

 

20 comentarios para “Simular un evento en AS3”

  1. Es una opción GersonM, aunque ya siempre utilizo la llamada a la función con null, es lo más simple.

  2. Es una buena alternativa pero creo que con un

    elComponente.dispatchEvent(new MouseEvent(MouseEvent.CLICK));

    Seria mas comodo

  3. Perdon… lo que modifique fue el parametro Event de la fucnion Click, lo nombre Evento y funciono.

    function alClick(Event:MouseEvent):void {
    
    por
    
    function alClick(Evento:MouseEvent):void {

    para futuras referencias.

    Me despido y gracias!.

  4. Jeje, me alegro que te haya sido útil 😉

  5. Muchas gracias, si me funciono.

    Ojala sigan ayudando asi a las personas que no sabemos bien el AS3.

  6. Hola Omar
    pues yo he copiado tu codigo tal cual y funciona perfectamente, con un componente, con un movieclip y con un boton simple, tanto en linea de tiempo como en una clase. ¿?
    De todas formas, si no vas a usar el parámetro dentro de tu función alClick ponlo a null como predeterminado, es mucho mejor.
    Y un consejo, aunque no falla, evita llamar ‘Event’ al parámetro de la función alClick, es una palabra reservada, pon ‘evento’ o ‘e’ o lo que quieras, pero no ‘Event’

  7. He leido el post y es muy bueno, solo que a mi me marca el siguiente error: «1120: Access of undefined property alClick.»

    //importe un componente button al escenario
    
    import flash.events.MouseEvent;
    
    this.boton.addEventListener(MouseEvent.CLICK, alClick);
    
    function alClick(Event:MouseEvent):void {
    	trace ("Haz hecho click");
    }
    
    alClick(new MouseEvent(MouseEvent.CLICK));
    

    no se que esta pasando.