Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 23-06-2009, 13:45   #1 (permalink)
Neuer User
 
Registriert seit: Mar 2009
Beiträge: 38
EventListener

Hallo zusammen.
Bei mir ist ein Fehler aufgetreten und ich weiß nicht, wie ich ihn beheben kann. Auf der Bühne hab ich eine Schaltfläche mit Instanznamen a. Für diesen habe ich einen eventListener und eine Funktion. In der Funktion habe ich einen weiteren eventListener und die dazugehörige Funktion. Wenn man auf die Schaltfläche klickt, werden aber komischerweise beide Funktionen aufgerufen.
PHP-Code:
a.addEventListener(MouseEvent.CLICKhi);
function 
hi(evt:MouseEvent) {
    
trace("1. click")
    
    if(!
stage.hasEventListener(MouseEvent.CLICK)) {
        
stage.addEventListener(MouseEvent.CLICKzwei);
        function 
zwei(evt:MouseEvent) {
            
trace("2. click")
        }
    }

Gruß Manuel
Boost ist offline   Mit Zitat antworten
Alt 23-06-2009, 14:06   #2 (permalink)
Neuer User
 
Registriert seit: Mar 2009
Ort: Braunschweig
Beiträge: 164
Hallo,

das ist kein Fehler, das ist ein Feature :-)
Das hängt mit der Event-Verarbeitung in der Display-List
und den Event-Phasen zusammen.
Stichworte zum Nachlesen: display list, event dispatch.

Und dann gilt noch folgendes (aus class EventDispatcher),
was genau das Verhalten in deinem Fall beschreibt:

Zitat:
If the event listener is being registered on a node while an event is being processed on this node, the event listener is not triggered during the current phase but can be triggered during a later phase in the event flow, such as the bubbling phase.
Grüße,
Matthias Kievernagel.
mkiever ist offline   Mit Zitat antworten
Alt 23-06-2009, 14:07   #3 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
PHP-Code:
a.addEventListener(MouseEvent.CLICKhifalse);


function 
hi(evt:MouseEvent) {
    
trace("1. click");
    if (!
stage.hasEventListener(MouseEvent.CLICK)) {
        
stage.addEventListener(MouseEvent.CLICKzweitrue);
    }
}

function 
zwei(evt:MouseEvent) {
    
trace("2. click");

So wirds gehn. Der stage-MouseEvent wird jetzt nur in der Capturing-Phase aktiv.
Die Auslagerung der zweiten Funktion ist Kosmetik. Ineinanderschachteln sollte man vermeiden, wenn nicht wirklich nötig (Und es ist eigentlich nie nötig).
__________________
we will stop enhancing the truth in 3, 2, ...

Geändert von SpecOps-12 (23-06-2009 um 14:09 Uhr)
SpecOps-12 ist offline   Mit Zitat antworten
Alt 23-06-2009, 14:35   #4 (permalink)
Neuer User
 
Registriert seit: Mar 2009
Beiträge: 38
Hi,
danke schon mal für die antworten!!
Wenn man die aufnahmephase (Capturing-Phase) aktiviert, heißt das, dass das event bei eintritt sozusagen erst gespeichert wird?? Wird es bei dem zweiten event-eintritt dann erst ausgelöst ??
Der Code funktioniert nicht ganz. Das zweite Event (mit Capturing-Phase) wird nicht für einen bereich außerhalb der schaltfläche ausgelöst.

Gruß Manuel
Boost ist offline   Mit Zitat antworten
Alt 23-06-2009, 14:50   #5 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
Hmm. Stimmt.
Dann kann man's vielleicht so machen. Is ein Workarround. Vielleicht gibt's einen schlaueren Weg.

PHP-Code:
a.addEventListener(MouseEvent.CLICKhi);

function 
hi(evt:MouseEvent) {
    
trace("1. click");
    
setTimeout(setStageClick10);
}

function 
setStageClick():void {
    if (!
stage.hasEventListener(MouseEvent.CLICK)) {
        
stage.addEventListener(MouseEvent.MOUSE_DOWNzwei);
    }
}

function 
zwei(evt:MouseEvent) {
    
trace("2. click");

__________________
we will stop enhancing the truth in 3, 2, ...

Geändert von SpecOps-12 (23-06-2009 um 14:55 Uhr)
SpecOps-12 ist offline   Mit Zitat antworten
Alt 23-06-2009, 15:08   #6 (permalink)
Neuer User
 
Registriert seit: Mar 2009
Beiträge: 38
Hi,
du sagtest die auslagerung der 2. funktion ist kosmetik. Sollte man hier auch besser keinen eventListener und keine funktion in die funktion schreiben ??

warum wird bei dem code mit der capturing phase das mouseEvent für die bühne nicht registriert ??

Gruß Manuel
Boost ist offline   Mit Zitat antworten
Alt 23-06-2009, 15:34   #7 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
In der Capturing-Phase wird den "Ahnen", also, Eltern, Großeltern usw. des angeklickten targets mitgeteilt, dass das Event gefeuert wurde.

Der Hühnerfuß ist nun, dass, wenn das Objekt gar keine childrens hat, sondern selbst angeklickt wurde, es in der Capturing Phase von niemandem gesagt bekommt, dass etwas geklickt wurde.
Es ist nämlich dann selbst das Target, und wird erst in der Target-Phase informiert. Die wir durch das true im dritten Parameter von addEventListener ja zusammen mit der Bubbling-Phase weggelassen haben.

@Funktion in Funktion
Natürlich kann man EventListener in Funktionen setzen.
Nur Funktionen in Funktionen sind oft schlechter Stil. In AS2 hab ich das auch oft gemacht, um mir den Einsatz der Delegate-Klasse zu ersparen. Aber in AS3 gibts eigentlich keinen Grund dafür, zwei Funktionen, die logisch getrennt sind, ineinander zu schreiben.
__________________
we will stop enhancing the truth in 3, 2, ...

Geändert von SpecOps-12 (23-06-2009 um 15:37 Uhr)
SpecOps-12 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele