Very short trick: addEventListener() AS3, un handler più eventi

In Actionscript 3.0 è necessario utilizzare addEventListener() per intercettare un qualsiasi evento:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * Dato un MovieClip mc, si impostano eventi e handler
 */

mc.addEventListener( MouseEvent.CLICK, on_click );
mc.addEventListener( MouseEvent.ROLL_OVER, on_roll_over );
mc.addEventListener( MouseEvent.ROLL_OUT, on_roll_out );
/**
 * Funzioni di hander per gli eventi sopra indicati
 */

function on_click( e:MouseEvent ):void {
    // click
}
function on_roll_over( e:MouseEvent ):void {
    // roll over
}
function on_roll_out( e:MouseEvent ):void {
    // roll out
}

In alternativa è possibile usare la forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mc.addEventListener( MouseEvent.CLICK, on_handler );
mc.addEventListener( MouseEvent.ROLL_OVER, on_handler );
mc.addEventListener( MouseEvent.ROLL_OUT, on_handler );
/**
 * Creo un'unica funzione per gestire tutti gli eventi
 */

function on_handler ( e:MouseEvent ):void {
    switch( e.type ) {
        case MouseEvent.CLICK:
             // click
             break;
        case MouseEvent.ROLL_OVER:
             // roll over
             break;
        case MouseEvent.ROLL_OUT:
             // roll out
             break;
    }
}

9 commenti a: “ ”

  1. 11 gen, 2009 I migliori post della settimana #9 | EmaWebDesign :: Web Programming / Web Design:

    [...] Very short trick: addEventListener() AS3, un handler più eventi In Actionscript 3.0 è necessario utilizzare addEventListener() per intercettare un qualsiasi [...]

  2. 02 dic, 2009 Roberto:

    Ciao, mi piace come hai ottimizzato, ma ti chiedo una cosa, se avessi più di un solo MovieClip mc, tipo: mc1,mc2…..(potrebbero essere per esempio i pulsanti di un menù), come li gestisci?grazie

  3. 02 dic, 2009 Giovambattista Fazioli:

    @Roberto:

    se avessi più di un solo MovieClip mc

    Nella funzione on_handler puoi fare riferimento all’oggetto di tipo Event, in questo caso MouseEvent. Questo oggetto, infatti, ti permette di avere le informazioni sull’oggetto che ha ricevuto l’evento. Se provi in questo modo:

    1
    2
    3
    4
    function on_handler ( e:MouseEvent ):void {
        trace(e.target.name);
        // ...
    }

    La proprietà target (o currentTarget) ti permetterà di sapere quale MovieClip hai selezionato.
    Vedi nel dettaglio la documentazione sia di target che di currentTarget che, anche se a prima vista sembrano del tutto identici, in alcuni casi (vedi bottoni complessi costruiti con più MovieClip annidati) possono darti la corretta informazione che cerchi.

  4. 02 dic, 2009 Roberto:

    @Giovambattista Fazioli: vado subito a guardare…:)…gentile…in caso mi ripresento..:)

  5. 02 dic, 2009 Roberto:

    @Giovambattista Fazioli:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    btn1_mc.addEventListener( MouseEvent.MOUSE_OVER, on_handler );
    btn1_mc.addEventListener( MouseEvent.MOUSE_OUT, on_handler );

    function on_handler ( e:MouseEvent ){
        switch( e.type ) {
            case MouseEvent.MOUSE_OVER:
                 trace(e.currentTarget.name);//funziona, visualizza "btn1_mc" ossia il nome dell'istanza del primo pulsante
           btn1_mc.gotoAndPlay(2);
                 break;
            case MouseEvent.MOUSE_OUT:
                 btn1_mc.gotoAndPlay(16);
                 break;
        }
    }

    Quindi

    1
    trace(e.currentTarget.name)

    funziona, ma come posso associarlo all’istruzione sucessiva? al posto di

    1
     btn1_mc.gotoAndPlay(2);
  6. 02 dic, 2009 Giovambattista Fazioli:

    @Roberto: è molto semplice: e.target è un puntatore all’istanza del MovieClip, quindi basta usare:

    1
    e.target.gotoAndPlay(2);

    In pratica btn1_mc, o qualsiasi altra istanza, corrisponde a e.target

  7. 02 dic, 2009 Roberto:

    @Giovambattista Fazioli: Bhe che dire, avevo provato da buon smanettone con
    [cc_actionscript3](e.currentTarget.name).gotoAndPlay(2)[\as]…..tolto il .name e via le parentesi…..e funzia…quindi GRAZIE….:)

  8. 02 dic, 2009 Roberto:

    @Roberto: mi permetto di concludere, nel caso qualcun’altro cercasse info a riguardo, che nel caso appunto di più mc (es: pulsanti), con un array e un clico è possibile raggruppare i vari mc ed assegnare gli “addEventListener” es:

    1
    2
    3
    4
    5
    for (var i:int=0; i<btn_array.length; i++) {
    btn_array[i].addEventListener( MouseEvent.CLICK, on_handler );
    btn_array[i].addEventListener( MouseEvent.MOUSE_OVER, on_handler );
    btn_array[i].addEventListener( MouseEvent.MOUSE_OUT, on_handler );
    }

    …..salve e spero di essere utile a qualcunaltro….:)

  9. 02 dic, 2009 Giovambattista Fazioli:

    @Roberto: ottimo! Sempre per concludere, se la serie di “pulsanti” (MovieClip) sono inseriti in un MovieClip contenitore, puoi addirittura evitare l’array e ciclare su tutti i “figli” del contenitore stesso. Al riguardo ti consiglio di leggere Tutto quello che avete sempre sognato di fare con Actionscript 3
    Saluti e grazie per i tuoi contributi

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre> // blocco generico
                   <code></code> // blocco generico
                   [cc_actionscript][/cc_actionscript] // Actionscript
                   [cc_actionscript3][/cc_actionscript3] // Actionscript 3
                   [cc_css][/cc_css] // CSS Style Sheet
                   [cc_html][/cc_html] // HTML
                   [cc_js][/cc_js] // Javascript
                   [cc_objc][/cc_objc] // Objective-C
                   [cc_php][/cc_objc] // PHP
                   [cc_sql][/cc_sql] // SQL