2016-01-19 1 views
0

У меня есть компонент RichEditableText с искробезопасной кожей. И у меня есть слушатель для событий клавиатуры в моем приложении для некоторых настраиваемых горячих клавиш. Я хотел, чтобы пропустить эти горячие клавиши, если я пишу в RichEditableText так я добавил это:Почему объект KeyboardEvent.target возвращает false в условии «is», сравнивая его с его типом?

if (event.target is RichEditableText) { 
    return; 
} 

Но по какой-то причине, что не работает. Поэтому я использовал getQualifiedClassName (event.target) и получил spark.components :: RichEditableText. Я импортировал это как:

import spark.components.RichEditableText; 

Почему исходный условный номер не работает?

EDIT:

Вот более тщательное протоколирование:

log.info("event.target is RichEditableText " + (event.target is RichEditableText)); 
log.info("event.target instanceof RichEditableText " + (event.target instanceof RichEditableText)); 
log.info("event.target.constructor == RichEditableText " + (event.target.constructor == RichEditableText)); 
log.info("Class(getDefinitionByName(getQualifiedClassName(event.target))) == RichEditableText " + (Class(getDefinitionByName(getQualifiedClassName(event.target))) == RichEditableText)); 
log.info("event.target actually is " + getQualifiedClassName(event.target)); 

И результаты:

false 
false 
false 
true 
spark.components::RichEditableText 

По какой-то причине только самый медленный и самый сложный метод работал. Я могу использовать его, но если кто-то может поделиться своими мыслями о том, почему другие не работают, это было бы здорово.

+0

try event.CurrentTarget – Eric

+0

'FlexSprite' (база всех компонентов Flex) переопределяет' toString() 'для вывода местоположения спрайта в дереве отображения. 'event.target is RichEditableText' * будет * быть истинным, если целью является экземпляр RichEditableText. – Aaron

+0

Как вы все это испытываете? Как вы регистрируетесь? – null

ответ

1

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

getDefinitionByName() использует текущий домен приложения, из которого вы его вызываете. Таким образом, в единственной успешной строке журнала вы сравниваете класс, который у вас есть в текущем домене, с ссылкой RichEditableText, который также находится в текущем домене, что естественно дает истину.