apache-flex - 如何防止 TextField 中的向上/向下箭头默认行为?

标签 apache-flex flash actionscript-3 textfield

我正在为关键字制作一个输入字段,而在用户写作时,我正在插入符号位置下方的列表中显示对关键字的建议。
输入字段是单行,因此我使用向上/向下箭头键选择建议并按 Enter 将其插入。
它主要工作,除了向上/向下键还将插入符号位置更改为 TextField 的开始/结束的一个很大的异常(exception)。

我已经尝试在 preventDefault() 事件监听器中使用 stopImmediatePropagation()KeyboardEvent.KEY_DOWN,我也用它们来更改选定的建议,但这不会改变任何内容。
KeyboardEvent.KEY_DOWN 事件被触发时,我检查了 carret 尚未移动,但在视觉上我可以看到它在释放键(键向上)之前正在移动。

我可以只保存插入符号位置,然后重置默认行为。但这将适本地涉及使用计时器的一些类似黑客的代码。

那么有谁知道如何防止默认行为?

最佳答案

你不能阻止它,但你可以逆转它。为此,您将具有不同优先级的处理程序添加到同一事件 - KeyboardEvent.DOWN。一个将在 TextField 的 之前执行,并保存选择索引,另一个在之后,恢复它们。工作代码如下:

    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    import mx.controls.TextInput;
    import mx.events.FlexEvent;

    public class FooledTextInput extends TextInput
    {
        private var ssi : int = 0;
        private var sei : int = 0;

        public function FooledTextInput()
        {
            super();

            this.addEventListener(KeyboardEvent.KEY_DOWN, onBeforeKeyDown, false, 10000);
            this.addEventListener(KeyboardEvent.KEY_DOWN, onAfterKeyDown, false, -10000);
        }

        private function onBeforeKeyDown(e : KeyboardEvent) : void
        {
            if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
            {
                ssi = this.selectionBeginIndex;
                sei = this.selectionEndIndex;
            }   
        } 

        private function onAfterKeyDown(e : KeyboardEvent) : void
        {
            if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
            {
                this.setSelection(ssi, sei);
            }   
        } 
    }

您可能想要更好的 ssi(选择开始索引)和 sei(选择结束索引)名称,我懒得找一些。
我认为这个解决方案是基于 Alex Harui 的一篇文章,我记不清了,但他的博客上有很多与 Flex 相关的好东西。

更新: 对于 spark TextInput,防止不仅是可能的,而且非常容易。您需要做的就是在捕获阶段捕获事件并停止传播。代码:
package
{
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    import spark.components.TextInput;

    public class HackedTextInput extends TextInput
    {
        public function HackedTextInput()
        {
            super();
            addEventListener(KeyboardEvent.KEY_DOWN, onBeforeKeyDown, true);
        }

        private function onBeforeKeyDown(e:KeyboardEvent) : void
        {
            if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
            {
                e.stopImmediatePropagation();
            }   
        }  
    }
}

请注意 addEventListener 调用中的最后一个参数,该参数设置为 true 以便在捕获阶段调用处理程序。遗憾的是,此解决方案不适用于 mx TextInput,仅适用于 spark。

关于apache-flex - 如何防止 TextField 中的向上/向下箭头默认行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1018259/

相关文章:

css - 克服在我的 List Flex4 上设置的主题属性

css - Flex 3 css 嵌入在 Linux 上抛出 "Invalid Embed directive in stylesheet' 错误

actionscript-3 - 如果运行时加载的 Assets 不被使用,它们是否会消耗内存/资源?不仅仅是编译 Assets ?

flash - 在 saucelabs/selenium webdriver 中禁用 flash?

javascript - .@ 是 Javascript 符号吗?

flash - 我应该怎么做才能在 Flash Builder 中使用 .as3proj 文件?

linux - 绕过 Flash 播放器版本检查或覆盖现有版本号?

jquery - 使用uploadify后台上传

actionscript-3 - 如何使用ASC2.0修复Error “A conflict exists with definition * in namespace public.”?

actionscript-3 - AS3中的突破游戏错误#2007