【问题标题】:Debugging focus and event propagation in Flex在 Flex 中调试焦点和事件传播
【发布时间】:2009-12-18 15:23:48
【问题描述】:

我有一个自定义的TitleWindow 组件,该组件已注册以侦听来自用户的键盘事件(以便 esc 关闭窗口、输入保存等)。然而,在我的测试中,我发现了一些我的键盘事件处理程序没有触发的情况。

我对为什么会发生这种情况的最佳猜测是,某处的某个子组件窃取了焦点并阻止了键盘事件的传播。不幸的是,由于我的TitleWindow 中有大量的组件,我无法知道是谁偷了焦点。

那么我的问题是,有没有什么好的技巧/技术/工具来调试 Flex 中的焦点问题和事件传播?基本上,我需要一些东西来告诉我在任何给定时间谁是焦点,谁在任何给定时间处理事件......这可能吗?

【问题讨论】:

    标签: apache-flex actionscript-3 debugging


    【解决方案1】:

    利用Focus Manager,您可以调用getFocus(),您将收到当前具有焦点的IFocusManagerComponent 返回。

    从那里,您可以使用flash.utils.getQualifiedClassName() 确定哪种类型的对象窃取了焦点并采取相应措施。

    对于任何给定时间的事件处理,您希望将 e.target 与 e.currentTarget 进行比较。

    【讨论】:

    • 感谢 Tegeril,通过使用 FocusManager,我能够发现谁窃取了焦点并消耗了键盘事件,问题解决了!关于您的事件处理解决方案,我要提到的一件事是,因为没有调用我的处理程序,所以我没有地方设置断点并检查 e.target 和 e.currentTarget。当您既不能控制分派事件的项目也不能控制处理事件的项目时,这是一个非常棘手的情况!
    • 啊,关于这些事件的观点非常好。我想不出一种方法来捕获非冒泡事件,如果它们在你没有听的对象上触发,也许有人可以提供一些输入并启发我们:)
    【解决方案2】:

    我刚刚发现以下技术可能对调试焦点问题非常有帮助:

    private function handleTextInputFocus(event:FocusEvent):void {
      try {
        throw new Error('test');
      } catch (e:Error) {
        trace(e.getStackTrace());
      }
    }
    

    堆栈可以解释为什么文本输入窃取了另一个组件的焦点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多