как применить событие Focus_out не только к выбранному компоненту

#apache-flex #actionscript-3 #events #focus #mouseevent

#apache-flex #actionscript-3 #Мероприятия #фокус #mouseevent

Вопрос:

Я использую код, основанный на этом сообщении.

Оно использует событие focus_out для определения, есть ли изменения, которые необходимо зафиксировать. Однако я замечаю, что событие FOCUS_OUT вызывается, только если вы щелкнете вдали от текстового поля, но внутри компонента. Есть ли какой-либо способ, которым я могу прослушивать щелчки вне компонента изнутри компонента?

     addEventListener(FocusEvent.FOCUS_OUT, onFocusOut);

    protected function onFocusOut(event:FocusEvent):void
    {
        _updatedText = text;

        if(_updatedText != _originalText){
            dispatchEvent(new Event(Event.CHANGE));
        }

        setEditable(false);
    }
  

Ответ №1:

В самом компоненте вы можете сделать это:

 systemManager.addEventListener( FocusEvent.KEY_FOCUS_CHANGE, focusChangeHandler );
systemManager.addEventListener( FocusEvent.MOUSE_FOCUS_CHANGE, focusChangeHandler );
  

Просто убедитесь, что вы очистили и удалили прослушиватель событий, прежде чем ваш компонент будет удален со сцены (при условии, что он добавляется динамически). Это не позволит вам создавать кучу прослушивателей событий.

В качестве альтернативы, если вы просто хотите узнать, когда кто-то нажимает за пределами определенного компонента, вы можете сделать что-то вроде этого:

 systemManager.addEventListener( MouseEvent.MOUSE_DOWN, system_mouseDownHandler );

private function system_mouseDownHandler( event:MouseEvent ):void {
  if( !event.target != this amp;amp; !this.contains(event.target as DisplayObject) ){
    // Do Something Here
  }
}
  

Опять же, убедитесь, что вы очистили все прослушиватели событий, если этот компонент добавляется / удаляется динамически.

Надеюсь, это поможет!

Редактировать:

Если вы хотите очистить EventListeners, сделайте что-то вроде этого (вызывается при запуске события удаления в вашем компоненте):

 <mx:Component remove="myRemoveHandler();" />

private function myRemoveHandler():void {
  if( systemManager.hasEventListener( MouseEvent.MOUSE_DOWN ) systemManager.removeEventListener( MouseEvent.MOUSE_DOWN, system_mouseDownHandler );
}
  

Очевидно, замените прослушиватели событий, которые вы в конечном итоге использовали (фокус или мышь).

Комментарии:

1. я добавил его в функцию init в списке, который содержит itemrenderer, где находится событие onfocusout, и, похоже, оно работает! теперь, если функция инициализации списка запускается только при первом посещении состояния (я думаю, именно так это работает).. нужно ли мне беспокоиться об объединении слушателей?

2. Я обновил свой ответ, чтобы показать вам, как очистить прослушиватели событий в случае, если вы используете removeChild() и addChild() — пожалуйста, отметьте мой ответ как принятый, щелкнув зеленую галочку.

3. я имел в виду, что прослушиватель событий находится в компоненте, который инициализируется только один раз во время выполнения приложения, поэтому прослушиватель не должен появляться более одного раза.. (bc я не использую addChild / removeChild.) хотя эта команда hasEventListener выглядит очень полезной, спасибо

Ответ №2:

В классе LabelEditor отправляет событие.ИЗМЕНИТЕ событие на focus out, вы можете просто прослушать это событие

Комментарии:

1. возможно, вам придется поиграть с пузырьками в dipatcher

2. это вызывает функцию для focus_out, но функция не вызывается, поэтому я делаю вывод, что щелчок вне компонента не считается focus_out, поэтому ничего не отправит. вы думаете, что если у меня есть прослушиватель событий в моем основном приложении, который прослушивает список, содержащий labeleditor для вывода фокуса, который должен его перехватить?

3. Для запуска focus out вам нужно изменить фокус, щелчок по панели или холсту не изменит фокус, потому что они никогда не могут иметь фокус. Возможно, вы захотите пересмотреть свой подход.

4. Возможно, для элементов, на которых вы хотите изменить фокус, добавьте eventlistener для события click и вызовите функцию для выполнения этого этапа. фокус = этап

5. Согласен, вам не следует использовать focusOut, если вы действительно заинтересованы в вводимом в данный момент тексте. Используйте событие change.