![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Mar 2006
Сообщений: 76
|
Как сделать ограничение после ввода в текст инпут числа ограничение такого типа 1.00 т.е. если вводиться целое число то знаком скока угодно но после точки всего два знака может быть?
|
|
|||||
|
Модрон-ветеринар
|
Готовых методов, насколько мне известно, нет. Нужно писать функцию на событие текстового поля onChanged, которая бы проверяла, введена или нет точка. Если точка введена, то свойство maxChars для текстового поля оперативно устанавливается в количество уже введенных символов (длина введенной строки) + 2. Остается только вопрос, как быть, если юзер захочет изменить целую часть.
Другой вариант - на onChanged брать введенную строку, приводить к Number, усекать до двух знаков после точки и тут же выводить в поле усеченное значение. Да, этот способ лучше, но он предполагает, что юзер в какой-то момент все-таки сможет ввести больше двух знаков после точки. UPD: Вот возможное решение придумалось (с onChanged, как оказалось, решение не очень получается). Пример для 3-х полей ввода, можно повесить проверку на любое количество полей ввода по аналогии: ///// ОГРАНИЧЕНИЕ КОЛИЧЕСТВА РАЗРЯДОВ ПОСЛЕ ТОЧКИ В ПОЛЕ ВВОДА //////////// var restrictLength:Number = 2; //разрешенная длина дробной части input1_tf.onSetFocus = startCheck; input2_tf.onSetFocus = startCheck; input3_tf.onSetFocus = startCheck; //... и т.д. function startCheck () { id = setInterval (checkSymbols, 10, this); //this - передаем в функцию для постоянной проверки имя текстового поля this.onKillFocus = stopCheck; //при потере полем фокуса отключаем проверку поля } function stopCheck () { clearInterval (id); } function checkSymbols (tf:TextField) { //функция проверки var pointIndex:Number = tf.text.indexOf('.'); //положение точки в поле var cursorIndex:Number = Selection.getCaretIndex(); //положение курсора в поле var tfLength:Number = tf.text.length ; //длина введенной строки if (pointIndex >= 0 ) { //если точка в поле введена tf.restrict = '0-9'; //исключаем точку из возможных к вводу символов, оставляем только цифры if (cursorIndex > pointIndex) { //если курсор справа от точки //вычисляем длину имеющейся дробной части: var fractLength:Number = tfLength - pointIndex - 1; //ставим ограничение на длину вводимой строки, //тем самым фактически ограничиваем число символов после точки: tf.maxChars = tfLength + (restrictLength - fractLength); } else { //если курсор слева от точки (в целой части введенного числа) tf.maxChars = undefined ;//снимаем ограничение на длину вводимой строки } } else { //если точка не введена tf.restrict = '0-9.'; //разрешаем вводить и цифры, и точку tf.maxChars = undefined ; //снимаем ограничение на длину вводимой строки } //предотвращаем разбиение уже введенной строки точкой в произвольном месте if (cursorIndex < tfLength) { //если курсор не находится в конце введенной стороки, то также tf.restrict = '0-9'; //исключаем точку из возможных к вводу символов, оставляем только цифры } } - ввести триггеры установки того или иного состояния, чтобы не производить постоянные лишние действия с разрешением-запрещением ввода, если они уже были произведены, - ограничение на ввод нулей перед значимой частью числа, но уже лень самому, так работает и принцип ясен. ![]() Интересно, может быть есть какое-то более простое решение? Последний раз редактировалось mooncar; 30.11.2009 в 03:09. |
|
|||||
|
Регистрация: Mar 2006
Сообщений: 76
|
Спасибо буду пробовать)
|
|
|||||
|
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Можно поискать библиотеку regexp для AS2, уверен, что такая найдется.
|
|
|||||
|
Модрон-ветеринар
|
То есть использовать регулярное выражение, означающее "не более двух цифровых символов после точки" и также постоянно делать проверку в интервальной функции?
|
|
|||||
|
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Если речь идет о форме, я бы не стал вешать проверку на интервал, а проверял бы правильность введенных данных через некоторое время после остановки ввода:
var timeoutID:Number; txt.onChanged = onChangedHandler; function onChangedHandler(target:TextField):Void { if (timeoutID) clearTimeout(timeoutID); timeoutID = setTimeout(timeoutHandler, 2000); } function timeoutHandler():Void { delete timeoutID; trace("проверка на соответствие заданному шаблону"); } |
|
|||||
|
Модрон-ветеринар
|
udaff, если только речь идет не о проверке, а именно о вводе новых правил ограничения. Тут вроде автору нужно не проверка пост-фактум, а именно недопущение.
Но еще одна засада с onChanged. ИМХО, не получится. Если юзер сделал ввод в дробной части и курсор остался там, то ограничения на ввод работать должны. Но если он просто мышкой перещелкнул в целую часть (события onChanged при этом не было!), то ограничения должны сняться, то есть должны заработать другие правила - ведь целую часть можно добавлять, в отличии от дробной. Поэтому я остановился на непрерывной проверке через интервальную функцию, пока поле имеет фокус ввода. У автора, насколько я знаю, форма. Последний раз редактировалось mooncar; 30.11.2009 в 12:40. |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:32. |
|
|
« Предыдущая тема | Следующая тема » |
|
|