为什么KeyboardEvent.target对象在“is”条件下返回false,并将其与类型进行比较?

时间:2016-01-19 13:50:17

标签: actionscript-3 flash flex actionscript

我有一个自定义皮肤Spark的RichEditableText组件。我在我的应用程序中为一些自定义热键监听键盘事件。如果我写入RichEditableText,我想跳过这些热键,所以我添加了这个:

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

但由于某种原因,这种方式无效。所以我使用了getQualifiedClassName(event.target)并获得了 spark.components :: RichEditableText 。我有这样的导入:

import spark.components.RichEditableText; 

为什么原始条件不起作用?

修改

以下是更全面的日志记录:

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

出于某种原因,只有最慢和最复杂的方法才有效。我可以使用它,但如果有人可以分享他们为什么别人不工作的想法,那就太好了。

1 个答案:

答案 0 :(得分:1)

当侦听器和事件源位于不同的应用程序域中时,可能会发生这种情况。这样,您可以拥有完全相同的限定名称,但它们背后有不同的类。

getDefinitionByName()使用您调用它的作用域的当前应用程序域。因此,在唯一成功的日志行中,您将当前域中的类与RichEditableText引用进行比较,该引用也位于当前域中,这自然会产生真实。