加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 01:48:46 所属栏目:百科 来源:网络整理
导读:我正在为关键字创建输入字段,而用户正在编写我在插入符号位置下方的列表上显示关键字的建议. 输入字段是单行,所以我使用向上/向下箭头键选择建议,然后按Enter键插入. 它主要是工作,但有一个很大的例外,即向上/向下键也会将插入位置更改为TextField的开头/结
我正在为关键字创建输入字段,而用户正在编写我在插入符号位置下方的列表上显示关键字的建议.
输入字段是单行,所以我使用向上/向下箭头键选择建议,然后按Enter键插入.
它主要是工作,但有一个很大的例外,即向上/向下键也会将插入位置更改为TextField的开头/结尾.

我已经尝试在KeyboardEvent.KEY_DOWN事件监听器中使用preventDefault()和stopImmediatePropagation(),我也用它来更改所选的建议,但这不会改变任何东西.
当我发现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,-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,true);
        }

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读