Flex 3:在TextArea中禁用退格键和删除键

3

我正在尝试防止任何按键改变Flex TextArea中的文本。我不想将editable属性设置为false,因为我希望插入符号对于“当前位置”指示器是可见的,这样用户就知道搜索从哪里开始。

我添加了change和textInput事件处理程序,以及keyUp和keyDown事件处理程序,它们都执行'event.preventDefault'和'event.stopImmediatePropagation'。对于大多数键来说,这很有效,但是对于退格键和删除键除外。

有没有办法防止这些按键做任何事情?


在你的事件监听器中,你是否使用了捕获阶段来阻止默认行为和停止事件传播? - JD Isaacks
4个回答

2
这可能会有所帮助:
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            private function onKeyDown(event:KeyboardEvent):void {
                if ( event.keyCode == 8 || event.keyCode == 46 ) {
                    event.preventDefault();
                }
            }
    ]]>
    </mx:Script>
    <mx:TextArea keyDown="onKeyDown(event);" width="100%" height="100%" />
</mx:WindowedApplication>

很不幸,它并没有起作用!我尝试过类似的方法,虽然事件处理程序被调用了,但文本仍然被删除了,我不知道为什么...... - Nic
好的,我已经测试过作为桌面应用程序可以运行,但是作为Web应用程序就无法运行。 - Lucas Gabriel Sánchez

1

嗯,看起来在浏览器中确实不起作用,有没有解决方法,不确定你是否喜欢,但似乎除了粘贴之外,它能够实现你需要的功能:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;

            private var _lastSelStart:Number = 0;
            private var _lastSelEnd:Number = 0;
            private var _lastText:String = null;
            private var _prevent:Boolean = false;

        private function onKeyDown(event:KeyboardEvent):void {
            if ( event.keyCode == 8 || event.keyCode == 46 ) {
                if ( !_prevent ) {
                    _prevent = true;
                    _lastText = txt.text;
                    _lastSelStart = txt.selectionBeginIndex;
                    _lastSelEnd = txt.selectionEndIndex;
                }
            }
        }

        private function onKeyUp( event:KeyboardEvent ):void {
            if ( _prevent ) {
                _prevent = false;
                txt.text = _lastText;
                _lastText = null;
                callLater(txt.setSelection, [_lastSelStart, _lastSelEnd]);
            }
        }

        ]]>
    </mx:Script>
    <mx:TextArea keyDown="onKeyDown(event);" keyUp="onKeyUp(event);" width="100%" height="100%"
        id="txt" />
</mx:Application>

非常感谢您的帮助 - 非常感激。我认为我还需要一些逻辑来处理按住键,但这看起来很不错。可惜必须复制字符串 - 这可能会出问题! - Nic
我修改了代码以处理按键被按住的情况。如果这有帮助,您能将其标记为答案吗? - user56250

1

为什么不在更改时重新插入文本?


嗯,有趣的想法,但是在触发更改事件时,文本字段已经更改了,这意味着我必须保留文本的第二个副本。我将处理一些相当大的字符串,因此不希望这样做。此外,在此阶段,选择开始和结束索引都相等,因此如果用户选择了一块文本,则似乎没有办法找出他实际更改了什么?或者你可以从事件中得到它吗? - Nic
@Mike 如果您将文本字段绑定到保存文本的变量,则无需保留文本的第二个副本。然后,要更改文本,请更改变量。在文本字段的键侦听器中重置为您的变量值。我还没有测试过,但在我的脑海中听起来是正确的。 - JD Isaacks

0
我想我已经找到了一种方法: 在Flash中,preventDefault对于键事件无效,但对于更改事件非常有效。您可以执行类似于https://stackoverflow.com/a/8078910/1927950的操作,以避免任何修改但仍保留插入符号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接