全局事件监听器,当焦点在文本输入中时

时间:2011-04-07 14:38:39

标签: flex focus listener global textinput

我正在尝试创建一个全局eventListener。一切正常,KeyboardEvent.KEY_DOWN始终触发..除了textInput有焦点的情况。

以下是我如何附加听众:

FlexGlobals.topLevelApplication.systemManager.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true);

我已经尝试了两种方法(使用捕获而不使用它)。我错过了什么?

感谢您的时间:)

2 个答案:

答案 0 :(得分:1)

首先,我不知道为什么你使用systemManager作为你的监听器对象,因为它不是显示列表的一部分,因此它无法获得冒泡事件。其次,使用FlexGlobals并不是最好的处理方式(个人而言,除了将其用于弹出式窗口之外,我没有看到为什么要使用它的原因很多)。

如果你想听一个全球性的事件,就把它放在舞台上。每个视图组件都有一个“stage”属性,指向flex应用程序的主要阶段。试试这个:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

答案 1 :(得分:0)

嗯......我真的不明白这是什么问题。

这是一个简单的应用程序:

    <?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               keyDown="application1_keyDownHandler(event)"
               creationComplete="application1_creationCompleteHandler(event)"
               >

    <fx:Script>
        <![CDATA[
            import flash.utils.getQualifiedClassName;

            import mx.core.FlexGlobals;
            import mx.events.FlexEvent;
            protected function application1_keyDownHandler(event:KeyboardEvent):void
            {
                trace("Key Down Handler: key = " + event.keyCode);
            }

            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                FlexGlobals.topLevelApplication.addEventListener(KeyboardEvent.KEY_DOWN, tlaKeyDownHandler);
                FlexGlobals.topLevelApplication.systemManager.addEventListener(KeyboardEvent.KEY_DOWN, smKeyDownHandler);
            }

            protected function tlaKeyDownHandler(event:KeyboardEvent):void
            {
                trace("Top Level Application Key Down Handler: key = " + event.keyCode);
            }

            protected function smKeyDownHandler(event:KeyboardEvent):void
            {
                trace("System Manager Key Down Handler: key = " + event.keyCode);
            }




        ]]>
    </fx:Script>

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Button x="130" y="135" label="Button"/>
    <s:ComboBox x="130" y="54"/>
    <s:TextInput x="130" y="99"/>
</s:Application>

这是一个输出:

按键式处理程序:键= 65

顶级应用程序按键向下处理程序:key = 65

System Manager Key Down Handler:key = 65

Key Down Handler:key = 83

顶级应用程序键向下处理程序:key = 83

System Manager Key Down Handler:key = 83

Key Down Handler:key = 68

顶级应用程序键向下处理程序:key = 68

System Manager Key Down Handler:key = 68

如您所见,我在应用程序中创建了三个不同的组件,并使用三种不同的方法来捕获事件。并且在所有情况下(当其中一个组件具有焦点时)事件被触发并捕获。

可能你没有告诉我们一些重要的事情。