2009-06-11 4 views
3

Das Verhalten, das ich verhindern möchte, ist, nachdem ein Benutzer auf eine Schaltfläche klickt, behält die Schaltfläche den Fokus bei, und wenn der Benutzer die Leertaste drückt, wird die Schaltfläche erneut ausgelöst. Also dachte ich, dass es gelöst werden könnte, indem man den Fokus woanders setzt, oder indem man die Taste ignoriert. Ich habe versucht, den folgenden keyDown-Ereignis-Listener auf der Schaltfläche hinzuzufügen, aber es hat nicht funktioniert.Wie kann ein Button nicht auf Space-Taste ausgelöst werden, wenn er Fokus hat?

private function btn_keyDown(event:KeyboardEvent):void { 
    // try to ignore spaces, i.e. don't click on SPACE when it has focus 
    if (event.keyCode == Keyboard.SPACE) { 
    } 
} 

Ich habe versucht, indem Sie folgendermaßen vorgehen Fokus ändern, am Ende der Funktion, die, wenn sie aufgerufen ist die Schaltfläche geklickt wird:

stage.focus = parent; 

aber das hat nicht funktioniert.

Antwort

4

Sie möchten eine benutzerdefinierte Schaltflächenkomponente erstellen und den keyDownHandler überschreiben. Wenn Sie jedoch die Schaltfläche (n) auswählen möchten, die gestoppt werden sollen, müssen Sie dem Code eine Bedingung hinzufügen. Dies ist, was es sollte wie folgt aussehen:

package Sandbox 
{ 
    import mx.controls.Button; 
    import flash.events.KeyboardEvent; 

    public class KeyButton extends Button 
    { 
     public function KeyButton() 
     { 
      super(); 
     } 

     protected override function keyDownHandler(e : KeyboardEvent) : void { 
      if (e.keyCode == 32) { // Spacebar 
       return; 
      } 
      else if (e.keyCode == 67) { // Letter C 
       this.parentApplication.setStyle ("backgroundColor", "#00aa00"); 
      } 

      super.keyDownHandler (e); 
     } 

    } 
} 

Der Vorteil hierbei ist, dass andere Schlüssel wird immer noch funktionieren, wie eingeben, oder können Sie mehr conditionals für verschiedene Schlüssel hinzufügen, wenn, sagen wir, Sie die Farbe ändern wollte die Taste, wenn Sie C oder was auch immer gedrückt haben.

Und während wir dabei sind, gibt es einen Unterschied zwischen KeyboardEvent.keyCode und CharCode. keyCode ist die ID des Schlüssels auf der physischen Tastatur, was bedeutet, dass Kleinbuchstaben c und Großbuchstaben C gleich sind (keyCode == 67). charCode hingegen ist die Adresse des Zeichens in der ASCII-Tabelle, also sind c und C verschieden (C ist 67, während c 99 ist). keyCode unterscheidet nicht zwischen Groß- und Kleinschreibung.

Oh, ja. Und sollten Sie die Schlüssel- und Zeichencodes eines Schlüssels (einschließlich willkürlicher wie Backspace) überprüfen müssen, lesen Sie diese page die guten Leute bei Adobe gemacht.

Ich machte auch eine application, um dies zu veranschaulichen. Es ist ein Standard-Flex Builder-Projekt, aber die Quelle befindet sich im Ordner "Src", wenn Sie es nicht haben. Starten Sie die Anwendung und klicken Sie auf die Schaltfläche, um sie zu fokussieren. Über dem Button sollte ein kurzer Text angezeigt werden. Während Sie den Fokus haben, drücken Sie die Leertaste, die das Click-Ereignis auslösen und mehr Text drucken soll, aber nichts passiert! Drücken Sie nun die Taste c, um die Hintergrundfarbe der Anwendung zu ändern. Ordentlich, wie?

Sie können die Quelle here finden.

1

Versuchen Hinzufügen event.stopPropogation(), um Ihre Handler innerhalb der „if“

0

Der Click-Handler vor allen keyup Handler auf die Schaltfläche Tag gebunden abgefeuert wird, so gibt es keine Möglichkeit, es zu löschen. Eine Möglichkeit, wie Sie das tun können, ist, eine Markierung zu setzen, ob das Ereignis durch Drücken der Leertaste verursacht wurde oder ob es sich um einen Klick handelt.

private var spacePressed:Boolean = false; 

private function onKeyDown(event:KeyboardEvent):void { 
    if (event.keyCode == Keyboard.SPACE) { 
     spacePressed = true; 
    } 
} 

private function onKeyUp(event:KeyboardEvent):void { 
    if (event.keyCode == Keyboard.SPACE) { 
     spacePressed = false; 
    } 
} 

private function doSomething():void { 
    if (spacePressed) 
     return; 
    // Normal handling... 
} 

 

<mx:Button label="Button" 
    keyDown="onKeyDown(event);" 
    keyUp="onKeyUp(event);" 
    click="doSomething();"/> 
0

Raumtaste innerhalb Knopfes des keyDownHandler, so einfach außer Kraft setzt es mit leeren Körper behandelt und es wird das Problem lösen. So:

package test 
{ 
import mx.controls.Button; 
import flash.events.KeyboardEvent; 

public class NoSpaceButton extends Button 
{ 
    public function NoSpaceButton() 
    { 
     super(); 
    } 

    override protected function keyDownHandler(event:KeyboardEvent):void 
    { 
    } 

} 
} 
7

Ich hatte das gleiche Problem, aber fand eine bessere Lösung, die keine benutzerdefinierten Schaltflächenklassen oder variablen Volleyball beinhaltet.

Wenn Sie nicht daran interessiert sind, dass Ihre Schaltfläche Teil der Tabulatorreihenfolge ist, legen Sie einfach die "focusEnabled" -Eigenschaft auf FALSE fest, damit die Leertaste (und die Eingabetaste) das Klickereignis der Schaltfläche auslöst.

Verwandte Themen