event que löschen

Kieren

Mitglied
Malzeit!

Situation:
Über einen Webservice wird ein Dateisystem ausgelesen.
Die einzelnnen Ordner werden jeweils einem dynamisch erstellten TextInput angezeigt.
Die TextInputs sollen via Eventhändling für den User wie eine zu bedienen sein.


Ich hab einen KeyDown-EventHandler für die TextInput's geschrieben der so aussieht
Code:
private function keyDownHandler_textinput(event:KeyboardEvent):void
{

var edit:TextInput = event.target.parent as TextInput;
if (event.keyCode == Keyboard.BACKSPACE && edit.text.length == 0 && this.numChildren > 1)
{
     clean_remove(edit);
     event.stopImmediatePropagation();
     event.updateAfterEvent();
     //event.stopPropagation();
}

clean_remove(edit);
^^Diese Funktion löscht das aktuelle Textfeld und setzt den Focus in das davorliegende

Soweit funktioniert alles prima

Problem:
Der Keyboard.BACKSPACE wird dabei nicht verbraucht, soll heißen in meinem TextInput links von dem Auslöser fehlt der letzte Buchstabe
Ohne "event.updateAfterEvent()" sogar der komplette Text

Wie kann ich die Event-Que so verändern das kein "Change"-Event in der mit dem neuen Focus belegten TextInput ausgelöst wird


Ich verwende AS3 unter Flex2 aber ich bin über alle Flesh Tips auch glücklich die kann man zu 95% inf Flex umsetzen

ps:Ich hab ein Problem mit Recht-, Groß- und Kleinschreibung also verbessert mich falls ihr Fehler findet Ich mach das echt nicht böswillig.
 
Hallo,

ich rekapituliere:

Diese Funktion wird aufgerufen, sobald eine Taste auf dem Keyboard gedrückt wird. Erst wird in der Variable "edit" eine Referenz auf ein bestimmtes Textfeld bzw. TextInput gespeichert. Dann kommt eine Bedingung:
Wenn die Taste, die gedrückt wurde, die Backspace-Taste ist und wenn sich im Textfeld "edit" kein einziges Zeichen befindet und die Anzahl an Kindern (Unterordnern? Andere Textfelder?) von this (bezeichnet this den EventHandler, das Objekt das den Handler auslöst oder das Textfeld?) grösser als 1 ist, dann soll das Textfeld "edit" gelöscht werden und der Fokus wird auf ein anderes Textfeld gelegt. Letzteres möchtest du nun verhindern, hab ich das richtig verstanden?

Du kannst mit der Selection-Klasse einem Element, das den Fokus erhalten kann, zuordnen. Du könntest also dem Textfeld, das den Fokus bekommt, aber nicht bekommen soll ;), onFocus die Anweisung geben, den Fokus auf einen Button oder im unelegantesten Fall einer unsichtbaren Instanz zuzuweisen:

Code:
meinTextfeld.onFocus = function () {
    Selection.setFocus (fokusObjekt);
}

Du müsstest diese Anweisung aber irgendwie wieder löschen, sonst kann das Textfeld nie mehr den Fokus haben, ohne ihn direkt weiterzuleiten.

gruss
 
Ok fehlen wohl doch noch 1 oder 2 hintergrundinformationen

"edit" ist das TextInput in dem Backspace gedrückt wurde
"this" is eine HBox in der sich die TextInput's befinden und macht ja keinen Sinn das letzte TextInput zu löschen deswegen this.numChildren > 1

edit wird gelöscht das hast du richtig verstanden

Nun setzte ich in clean_remove(edit) den Focus auf das nächste TextInput hinter das letzte Zeichen
^^An dieser Stelle sollte schluss sein

Problem: Sobald mein keyDownHandler_textinput() durchlaufen ist wird ein "onChange" -Event für das TextInput(nenen wir es edit2) das jetzt den Focus hat ausgelöst!!

das ganze verhält sich jetzt so als hätte ich in edit2 hinter dem letzten Zeichen "BACKSPACE" gedrückt sprich das letzte Zeichen gelöscht

Anscheinend bleibt der BACKSPACE in der Event-Que erhalten und wirkt jetzt noch Zusätlich auf edit2

Ich bastel mal schnell ein bild auf dem man das sieht
 

Anhänge

  • 25624attachment.jpg
    25624attachment.jpg
    38,9 KB · Aufrufe: 11
Zuletzt bearbeitet:
Hallo,

da ich nun wirklich keine Ahnung von den Möglichkeiten in Flex habe, kann ich dir höchstens ein paar Denkanstösse liefern...

Für mein Empfinden handelt es sich hier um ein Handler-Problem, irgendein Handler, der nicht sauber entfernt wurde, oder automatisch zugewiesen wird, was weiss ich.
Die Funktion, die auf Tastendruck ausgeführt wird, bezieht sich vielleicht auch auf beide / alle TextInputs, vielleicht weil alle TextInputs in der Reihe mal an vorderster Postion waren und somit den Handler zugeteilt bekamen.
Reagiert der TextInput "edit2" denn auch auf die Backspace-Taste, wenn "edit" noch nicht leer ist?
Du müsstest vielleicht die Event-Handler der Textfelder löschen, die den Fokus verlieren. Und onChange passiert meines Wissens doch eigentlich gar nichts, wenn an onChange keine Funktion gebunden ist.

In Flash entfernt man Event-Handler folgendermassen:
Code:
delete edit2.onChange;

Mehr kann ich dazu irgendwie nicht beitragen, sorry!

gruss
 
hmm Ich glaub wir reden ein bischen aneinander vorbei aber ist ja nicht so schlim

Das Problem ist halt das der Backspace weitergereicht wird und das eigentlich keinen Sinn macht
edit2 soll sein onChange event schon behalten so ist das ja nicht

Es ist halt komisch das der Backspace so funktioniert als wäre der Curser schon die ganze Zeit in edit2

Ich überlegt nochmal mit nem Kolegen zusammen wenn ich ne Lösung find geb ich bescheid.

Trotzdem Danke für deine Bemühungen
 
Hi,

Dein Focuswechsel schiebt sich anscheinend zwischen den Eventlistener und die interne Keyeventbehandlung der Inputfelder. Vielleicht wäre ein Workaround möglich, indem Du den Focuswechsel mit einem Intervall (setInterval) einige Millisekunden verzögert ausführst.

Was genau macht "event.stopImmediatePropagation()"? vielleicht genügt es, Deine clean_remove-Methode als letztes auszuführen.

Gruß

P.S.: Flex ist für mich auch Neuland - meine Tipps gehen also auch nur ins Blaue. ;)
.
 
Also e ist anscheinend wirklich ein Zeit problem es reicht schon wenn ich
setInterval(edit.setFocus,1) mach damit das Problem nicht mehr auftrit
nur anschließend kann ich nie wieder setFoucs() machen was nicht ganz den Sinn trifft

Auch interesant der AS3 macht einfach weiter in der setInterval Zeit
sprich es wird ann weiter Code ausgeführt
 
Ich benutz jetzt
setTimeout()
damit Funktioniert es

danke für den Tip

ps: Wo kann man hier ein Flex Forum beantragen?
 
Zurück