Flex 3: отключение возврата и удаление в TextArea

Я пытаюсь предотвратить изменение текста во Flex TextArea с помощью любой клавиши. Я не хочу устанавливать для свойства editable значение false, потому что я хочу, чтобы курсор был видимым для индикатора «текущая позиция», чтобы пользователь знал, откуда начнется инициированный им поиск.

Я добавил обработчики событий для change и textInput, а также keyUp и keyDown, которые выполняют «event.preventDefault», а также «event.stopImmediatePropagation». Это отлично работает для большинства клавиш, за исключением backspace и delete.

Есть ли способ помешать им что-либо делать?


person Nic    schedule 09.12.2010    source источник
comment
В ваших слушателях событий, где вы preventDefault и stopPropagation, вы используете фазу захвата?   -  person JD Isaacks    schedule 09.12.2010


Ответы (4)


Хммм, похоже, что это действительно не работает в браузере, как насчет обходного пути, не уверен, понравится ли он вам, но, похоже, достигает того, что вам нужно, кроме вставки:

<?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>
person Community    schedule 09.12.2010
comment
Большое спасибо за вашу помощь - очень признателен. Думаю, мне также понадобится некоторая логика, чтобы справиться с зажатыми клавишами, но это выглядит хорошо. Жаль, что придется делать копию строки - это может взорваться! - person Nic; 09.12.2010
comment
Я изменил код для обработки нажатых клавиш. Кроме того, если это поможет, можете ли вы отметить это как ответ? - person ; 09.12.2010

Это может помочь:

<?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>
person Community    schedule 09.12.2010
comment
К сожалению, нет! Я пробовал что-то подобное, и хотя обработчик событий вызывается, текст все равно удаляется, и я не знаю почему ... - person Nic; 09.12.2010
comment
Хорошо, я тестировал как настольное приложение и работает, но как веб-приложение не работает. - person Lucas Gabriel Sánchez; 09.12.2010

Почему бы просто не вставить текст при изменении?

person spender    schedule 09.12.2010
comment
Хм - интересная идея, но к моменту срабатывания события изменения текстовое поле уже изменилось, что означает, что мне придется сохранить вторую копию текста. Я буду иметь дело с довольно большими строками, поэтому предпочел бы этого не делать. Кроме того, на этом этапе начальный и конечный индексы выбора равны, поэтому, если пользователь выбрал блок текста, похоже, нет способа выяснить, что он на самом деле изменил? Или вы можете получить это где-нибудь на мероприятии? - person Nic; 09.12.2010
comment
@Mike Вам не нужно хранить вторую копию текста, если вы привязываете текстовое поле к переменной, содержащей текст. Затем, чтобы изменить текст, измените переменную. и в ключевом слушателе текстового поля сбросьте значение вашего var. Я не тестировал это, но это звучит в моей голове. - person JD Isaacks; 09.12.2010

Думаю, я нашел способ: во флэш-памяти preventDefault не работает для ключевого события, но хорошо работает для изменения события. Вы можете сделать что-то похожее на этот https://stackoverflow.com/a/8078910/1927950, чтобы избежать каких-либо изменений, но все же держите каретку.

person AERYEN    schedule 28.08.2013