我试图阻止的行为是在用户点击按钮后,按钮保持焦点,然后如果用户点击空格键,则按钮再次触发。所以我认为可以通过将焦点设置在别处,或者通过让按钮忽略空格键来解决。我尝试在按钮上添加以下keyDown事件侦听器,但它不起作用。
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) {
}
}
我尝试通过执行以下操作来更改焦点,在单击按钮时调用的函数结束时:
stage.focus = parent;
但这也不起作用。
答案 0 :(得分:7)
我遇到了同样的问题,但找到了一个更好的解决方案,不涉及自定义按钮类或变量排球。
如果您不关心您的按钮是Tab键顺序的一部分,只需将“focusEnabled”属性设置为FALSE,这将停止空格键(并输入按钮)触发按钮的单击事件。
答案 1 :(得分:4)
您需要创建自定义按钮组件并覆盖keyDownHandler。但是,如果要选择要停止的按钮,则需要为代码添加条件。这应该是它的样子:
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);
}
}
}
这样做的好处是,其他按键仍然可以正常工作,例如Enter,或者你可以为不同的按键添加更多条件,例如,如果按C或其他任何按钮,你想改变按钮的颜色。
虽然我们正在使用它,但KeyboardEvent.keyCode和charCode之间存在差异。 keyCode是物理键盘上键的ID,这意味着小写c和大写C是相同的(keyCode == 67)。另一方面,charCode是ASCII表中字符的地址,因此c和C是不同的(C是67而c是99)。简而言之,keyCode不区分大小写。
哦,是的。如果您需要检查密钥的密钥和字符代码(包括Backspace之类的仲裁代码),请查看Adobe的优秀人员page。
我还制作了application来说明这一点。它是一个标准的Flex Builder项目,但如果您没有它,则源位于src文件夹中。启动应用程序,然后单击按钮将其聚焦。按钮的点击事件可以显示一些文本。虽然它有焦点,按空格键,它应该触发点击事件并打印更多文本,但没有任何反应!现在,按c键更改应用程序的背景颜色。干净,嗯?
您可以找到来源here。
答案 2 :(得分:1)
尝试将event.stopPropagation()添加到“if”
中的处理程序中答案 3 :(得分:0)
在绑定到按钮标记的任何键盘处理程序之前触发单击处理程序,因此无法取消它。你可以做你想做的一种方法是设置一个标志,无论事件是由按空格按钮引起的,还是来自点击的结果。
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();"/>
答案 4 :(得分:0)
空格按钮在Button的keyDownHandler
内处理,因此只需用空体覆盖它就可以解决问题。像这样:
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
{
}
}
}