Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.11.2009, 16:12
glukaviy вне форума Посмотреть профиль Отправить личное сообщение для glukaviy Найти все сообщения от glukaviy
  № 1  
Ответить с цитированием
glukaviy

Регистрация: Mar 2006
Сообщений: 76
По умолчанию Ограничение знаков после точки в текст инпут.

Как сделать ограничение после ввода в текст инпут числа ограничение такого типа 1.00 т.е. если вводиться целое число то знаком скока угодно но после точки всего два знака может быть?

Старый 29.11.2009, 18:18
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 2  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Готовых методов, насколько мне известно, нет. Нужно писать функцию на событие текстового поля onChanged, которая бы проверяла, введена или нет точка. Если точка введена, то свойство maxChars для текстового поля оперативно устанавливается в количество уже введенных символов (длина введенной строки) + 2. Остается только вопрос, как быть, если юзер захочет изменить целую часть.

Другой вариант - на onChanged брать введенную строку, приводить к Number, усекать до двух знаков после точки и тут же выводить в поле усеченное значение.
Да, этот способ лучше, но он предполагает, что юзер в какой-то момент все-таки сможет ввести больше двух знаков после точки.

UPD:
Вот возможное решение придумалось (с onChanged, как оказалось, решение не очень получается).
Пример для 3-х полей ввода, можно повесить проверку на любое количество полей ввода по аналогии:
Код AS1/AS2:
/////   ОГРАНИЧЕНИЕ КОЛИЧЕСТВА РАЗРЯДОВ ПОСЛЕ ТОЧКИ В ПОЛЕ ВВОДА ////////////
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.
Старый 30.11.2009, 03:43
glukaviy вне форума Посмотреть профиль Отправить личное сообщение для glukaviy Найти все сообщения от glukaviy
  № 3  
Ответить с цитированием
glukaviy

Регистрация: Mar 2006
Сообщений: 76
Спасибо буду пробовать)

Старый 30.11.2009, 06:09
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 4  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Можно поискать библиотеку regexp для AS2, уверен, что такая найдется.

Старый 30.11.2009, 06:16
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 5  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Цитата:
Сообщение от udaaff Посмотреть сообщение
Можно поискать библиотеку regexp для AS2, уверен, что такая найдется.
То есть использовать регулярное выражение, означающее "не более двух цифровых символов после точки" и также постоянно делать проверку в интервальной функции?

Старый 30.11.2009, 07:17
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 6  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Если речь идет о форме, я бы не стал вешать проверку на интервал, а проверял бы правильность введенных данных через некоторое время после остановки ввода:
Код AS1/AS2:
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("проверка на соответствие заданному шаблону");
}

Старый 30.11.2009, 12:28
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 7  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
udaff, если только речь идет не о проверке, а именно о вводе новых правил ограничения. Тут вроде автору нужно не проверка пост-фактум, а именно недопущение.
Но еще одна засада с onChanged. ИМХО, не получится. Если юзер сделал ввод в дробной части и курсор остался там, то ограничения на ввод работать должны. Но если он просто мышкой перещелкнул в целую часть (события onChanged при этом не было!), то ограничения должны сняться, то есть должны заработать другие правила - ведь целую часть можно добавлять, в отличии от дробной.
Поэтому я остановился на непрерывной проверке через интервальную функцию, пока поле имеет фокус ввода.
У автора, насколько я знаю, форма.


Последний раз редактировалось mooncar; 30.11.2009 в 12:40.
Создать новую тему Ответ Часовой пояс GMT +4, время: 01:40.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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