Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   не работает preventDedault() для TextEvent.TEXT_INPUT (http://www.flasher.ru/forum/showthread.php?t=159485)

ALEX666 01.07.2011 14:37

не работает preventDedault() для TextEvent.TEXT_INPUT
 
Нужно ограничить ввод в TextInput. Если новый введённый символ делает значение больше допустимого, запрещаем его ввод. (Изменение введённого значения не подходит, такое требование.)

Это не работает:

Код AS3:

 
        _inputWidth = new TextInput();
        _inputWidth.restrict = "0-9";
        _inputWidth.addEventListener(TextEvent.TEXT_INPUT, onChangingWidth);
 
        private function onChangingWidth(e:TextEvent):void{
                var value:Number = parseInt(_inputWidth.text + e.text);
                if(value > 8000)
                {                                        //заходит сюда
                        trace(e.cancelable);    //выводит true
                        e.preventDefault();    //введённый символ всё равно отображается!
                }
        }


saprahan 01.07.2011 15:20

Вам не поможет TextEvent.TEXT_INPUT. В официальной документации это явно не описывается, но для предотвращения ввода на spark:TextInput'e вам стоит слушать TextOperationEvent.CHANGING и превентить ввод по операции указанной в эвенте. Там не указывается каким будет текстовое значение, но определить его можно по самой текстовой операции.
Есть еще один вариант - использовать TextOperationEvent.CHANGE и откатывать текстовую операцию при недопустимом новом значении.
Третий вариант как самый дешевый - использовать некоторый контроллер-мидлмэн возвращающий предыдущее значение текстового поля, когда новое не соответствует паттерну.

ALEX666 01.07.2011 15:49

Насчёт 3-го варианта я думала, но он какой-то кривой вроде, некрасивый... а вот TextOperationEvent.CHANGING не использую ток потому что не знаю как там увидеть введённый символ..
"но определить его можно по самой текстовой операции." - а как именно?
спасибо

Добавлено через 10 минут
..2-ой вариант отменяет весь последний ввод, а не последний символ, поэтому не подходит(

saprahan 07.07.2011 18:10

Цитата:

Сообщение от ALEX666 (Сообщение 1008077)
Насчёт 3-го варианта я думала, но он какой-то кривой вроде, некрасивый... а вот TextOperationEvent.CHANGING не использую ток потому что не знаю как там увидеть введённый символ..
"но определить его можно по самой текстовой операции." - а как именно?
спасибо

Добавлено через 10 минут
..2-ой вариант отменяет весь последний ввод, а не последний символ, поэтому не подходит(

Объясняю на пальцах. Допустим вы вводите в филд текст с клавиатуры. Вылетает евент TextOperationEvent.CHANGING, у которого в поле operation лежит инстанс класса InsertTextOperation.
У него нам важны значения absoluteStart, absoluteEnd и text. Соответственно куда вставляем и какой текст. По этим значениям уже явно виден пользовательский ввод.

Метод бесспорно нудный и сложный, но 100% действующий.

ALEX666 08.07.2011 19:33

Спасибо, такое объяснение и нужно было, хотя уже воспользовалась другим способом:
при событии TextOperationEvent.CHANGING - запоминаю имеющийся текст
при событии TextOperationEvent.CHANGE - проверяю новое значение и возвращаю старое, если не подходит.


Часовой пояс GMT +4, время: 11:36.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.