Глобальный eventListener, когда фокус внутри texiInput

Я пытаюсь сделать глобальный EventListener. Все отлично работает, KeyboardEvent.KEY_DOWN срабатывает все время.. за исключением случаев, когда textInput имеет фокус.

Вот как я прикрепляю слушателя:

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

Я пробовал оба (использовать захват и без него). Что мне не хватает?

Спасибо за ваше время:)

2 ответа

Во-первых, я не знаю, почему вы используете systemManager как ваш объект слушателя, поскольку он не является частью списка отображения, следовательно, он не может получать всплывающие события. Во-вторых, использование FlexGlobals не лучший способ сделать что-либо (лично, кроме использования его для всплывающих окон, я не вижу много причин, почему вы должны его использовать).

Если вы хотите прослушать глобальное событие, просто поставьте его на сцену. Каждый компонент представления имеет свойство stage, которое указывает на основную стадию вашего flex-приложения. Попробуй это:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

Хм... я не очень понимаю, в чем проблема.

Вот простое приложение:

    <?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>

Вот вывод:

Key Down Handler: ключ = 65

Обработчик ключа приложения верхнего уровня: ключ = 65

Обработчик ключа менеджера системы: ключ = 65

Key Down Handler: ключ = 83

Обработчик ключа приложения верхнего уровня: ключ = 83

Обработчик ключа менеджера системы: ключ = 83

Key Down Handler: ключ = 68

Обработчик ключа приложения верхнего уровня: ключ = 68

Обработчик ключа менеджера системы: ключ = 68

Как видите, я создал три разных компонента в приложении и использовал три разных метода для перехвата события. И во всех случаях (когда один из компонентов имеет фокус) событие запускается и перехватывается.

Возможно, вы не сказали нам что-то важное.

Другие вопросы по тегам