我想听一下键盘事件的舞台,我想在它出现时直接捕捉一个事件(不是冒泡或目标)。为什么我不能这样做?
实际上我似乎根本无法使用useCapture
进行键盘事件。
我想通过按tilda按钮打开我的内部控制台窗口,并将焦点更改为输入字段。所以,我写了这样的东西
public function init(stage:Stage):void
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown);
}
private function onStageKeyDown(event:KeyboardEvent):void
{
event.stopImmediatePropagation();
switch(event.keyCode)
{
case Keyboard.BACKQUOTE:
visible = !visible;
stage.focus = visible ? inputField : stage;
break;
}
}
问题是,它写道"`"我输入中的字符,我不想让它做。因此,我决定尝试在捕获阶段收听键盘事件以阻止其传播。但似乎阶段不能有捕获阶段,因为之前没有节点。我该如何妥善处理这种情况?
答案 0 :(得分:0)
要简单回答您的问题,您可以在捕获阶段收听键盘事件。
最有可能的原因是,你没有注意力。如果您的应用程序中没有任何焦点,则舞台将不会获得键盘事件。默认情况下,当swf运行时,没有任何焦点。
在您的应用程序启动时(除了舞台本身之外的任何内容)给予项目焦点,并且事件将会到来。
public function init(stage:Stage):void
{
stage.focus = this; //assuming this is the document class
stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown, true);
}
现在,为了跟进你实际想要完成的事情(除了你的实际问题),你需要做的就是听取正确的事件(TEXT_INPUT)。你的答案很接近,但如果不需要标志或关键听众,它可以更简单:
stage.focus = this; //give something focus, probably not needed if you have to click the text input in order to input text
//listen on the capture phase for text input
stage.addEventListener(TextEvent.TEXT_INPUT, onStageTextInput, true);
function onStageTextInput(event:TextEvent):void
{
switch(event.text)
{
//if the new text was a backquote or @ sign, don't let the event trigger it's normal action
case "`":
case "@":
event.preventDefault(); //prevent default is needed
break;
}
}
答案 1 :(得分:-1)
我终于找到了解决此问题的方法。
首先:处理和停止KeyboardEvent.KEY_DOWN
并不妨碍TextField
获取输入。这很难过,因为在这种情况下它会很有用,但似乎还有一些其他理由不这样做。
所以,我应该做的是通过TextEvent.TEXT_INPUT
inputField
inputField.addEventListener(TextEvent.TEXT_INPUT, onTextInput);
并通过KeyboardEvent.KEY_DOWN
stage
stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown);
如果我可能仍想在tilda
中添加backquote
个TextField
个符号(例如通过应对和粘贴它们),我决定使用标记
private function onStageKeyDown(event:KeyboardEvent):void
{
switch(event.keyCode)
{
case Keyboard.BACKQUOTE:
...
inAction = true;
break;
}
}
所以当TextEvent.TEXT_INPUT
事件触发时,我可以看到是否打开了窗口操作。如果是,那么preventDefault()
行为,这意味着不在TextField
输入收到的签到
private function onTextInput(event:TextEvent):void
{
if(inAction)
{
event.preventDefault();
inAction = false;
}
}