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

Jac*_*rdt 4 apache-flex flash actionscript-3 textfield

我正在为关键字创建输入字段,而用户正在编写我在插入符号位置下方的列表上显示关键字的建议.输入字段是单行,因此我使用向上/向下箭头键选择建议,然后按Enter键插入.它主要是工作,但有一个很大的例外,即向上/向下键也会将插入位置改变为插入/结束TextField.

我已经尝试过使用preventDefault()并且stopImmediatePropagation()KeyboardEvent.KEY_DOWN事件监听器中我也用来更改所选的建议,但这并没有改变任何东西.当KeyboardEvent.KEY_DOWN事件被触发时,我检查了carret还没有移动,视觉上我可以看到它在释放钥匙之前正在移动(按键).

我可以保存插入位置,然后重置默认行为.但这恰恰涉及一些使用计时器的类似黑客的代码.

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

bug*_*lot 6

你不能阻止它,但你可以扭转它.为此,您可以向同一事件添加具有不同优先级的处理程序 - 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);
            }   
        } 
    }
Run Code Online (Sandbox Code Playgroud)

你可能想要更好的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();
            }   
        }  
    }
}
Run Code Online (Sandbox Code Playgroud)

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