powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Плиз помогите по JS
11 сообщений из 11, страница 1 из 1
Плиз помогите по JS
    #35210248
chenosov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сразу говорю, опыта нет.
Написал скрипт для проверки на клиенте вводимых данных, в примере 2 поля: целое и десятичное. Проверка по первому по порядку полю работает, вторая нет. Меняю порядок полей - все равно первая работает, вторая нет! Ткните носом в ошибку, плиз. Ниже текст:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
  <html>
  <head>
  <meta http-equiv="Content-Type" content='text/html; charset=windows-1251'>
  <meta name="Generator" content='EditPlus 2.20.211'>
  <meta name="Author" content='Ciber SLasH'>
  <title>JavaScript :: Проверка форм (GET)</title>
  <script type='text/javascript'>
 function checkForm(obj)  
{
	var element, pattern;
	emptypattern=/^\s*$/g;
	emailpattern=new RegExp("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$", "g");
	namepattern=/^[-]?[iIdD]\d{ 1 , 2 }([\.\,]+\d{ 0 , 2 }|)$/g;
	intpattern=/^[\+\-]?\d{ 1 , 6 }([\.\,]+\d{ 0 , 2 }|)$/g;
	for (var i =  0 ; i < obj.elements.length; i++) 
	{ // пробегаемся по всем элементам формы
		element = obj.elements[i];
		// И только если есть чего говорить юзеру в случае ошибки
		if (!element.getAttribute("check_message")) 
			continue;
		msg=element.getAttribute("check_message");
		if (pattern = element.getAttribute("check_pattern")) 
		{ 
			res=namepattern.test(pattern);
			if(res)
			{
				pattern=pattern.toUpperCase();
				if (pattern.indexOf("I")>= 0  || pattern.indexOf("D")>= 0 )
				{
					newpattern="^";
					if (pattern.indexOf("-")>= 0 )
						newpattern=newpattern+"[\+\-]?";
					newpattern=newpattern+"\\d{1,";
					if 	(pattern.indexOf("-")>= 0 )
					{
						if (pattern.indexOf(".")>= 0 )
							newpattern=newpattern+pattern.substr( 2 ,pattern.indexOf(".")- 2 );
						else	
							newpattern=newpattern+pattern.substr( 2 );
					}		
					else
					{
						if (pattern.indexOf(".")>= 0 )
							newpattern=newpattern+pattern.substr( 1 ,pattern.indexOf(".")- 1 );
						else	
							newpattern=newpattern+pattern.substr( 1 );
					}		
					newpattern=newpattern+"}";
					if 	(pattern.indexOf(".")>= 0 )
						newpattern=newpattern+"([\.\,]+\\d{0,"+pattern.substr(pattern.indexOf(".")+ 1 )+"}|)";
					newpattern=newpattern+"$";	
				}
				newpattern=new RegExp(newpattern, "g");
				if (!newpattern.test(element.value))
				{
					alert(msg);
					element.focus();
					return false;
				}
			} else
			{
				pattern = new RegExp(pattern, "g");
				if (!pattern.test(element.value))
				{
					alert(msg);
					element.focus();
					return false;
				}
			}	
		} else 
		{
			if(emptypattern.test(element.value)) 
			{ // иначе просто проверка что поле не пустое
				alert(msg);
				element.focus();
				return false;
			}
		}	
	}
	return true;
} 
</script>
  </head>
 <body>
  <form method="GET" action='GoodCheck.html' onSubmit='return checkForm(this)'>
  <input type="text" name="decimal" check_message="Десятичное !!!" check_pattern="-d6.2"> Десятичное<br>
  <input type="text" name="integer" check_message="Целое!" check_pattern="I6"> Целое<br>
  <input type="submit" value="submit">
  </form>
  </html>
...
Рейтинг: 0 / 0
Плиз помогите по JS
    #35210780
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ты наваял! А если полей будет в 5, 10 раз больше? А если нужна проверка на время, дату или сумму денег? - С такими стараниями твой код будет расти геометрически ...
Посоветую путь, по которому пошел сам: откуда-то твои страницы берутся? в смысле, серверная часть есть? - пусть она на тебя и работает. К примеру, у меня на серваке стоит Java, я передаю AJAX-запросом на сервер все поля, а на сервере уже разбираю их посредством функций парсирования чисел, дат и т.д. Если парсинг выдает исключение, возвращаю сообщение назад на страницу и выдаю ошибку, если все проходит - делаю сабмит.
К примеру, на клиенте обработать время - голову сломать можно, особенно если формат может быть европейский и американский, а у меня вся обработка вмещается в код (извините, что Java)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SimpleDateFormat europe_time = new SimpleDateFormat("H:mm");
SimpleDateFormat america_time = new SimpleDateFormat("h:mm a");
Date time = null;
try {
	time = europe_time.parse(_time);
} catch (ParseException exc_e) {
	try {
		time = america_time.parse(_time);
	} catch (ParseException exc_a) {
		result[ 0 ] = "false"; //это массив с результатом - на усмотрение
		return result;
	}
}
думаю, сравнение налицо ...
...
Рейтинг: 0 / 0
Плиз помогите по JS
    #35210905
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckПосоветую путь, по которому пошел сам: откуда-то твои страницы берутся? в смысле, серверная часть есть? - пусть она на тебя и работает. К примеру, у меня на серваке стоит Java, я передаю AJAX-запросом на сервер все поля, а на сервере уже разбираю их посредством функций парсирования чисел, дат и т.д.
Не всегда полезно использовать AJAX, если в том нет необходимости.

2 chenosov: давайте сначала заменим вашу поэму на нечто типа нижеследующего, а затем продолжим обсуждение и возможные варианты реализации.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
<script>
	var fieldTypes = {'t1':['int', 'Целое число'], 't2':['float', 'Дробное число']};
	function check(oForm){
		var message = '';
		for (var i= 0 ; oFormEl = oForm.elements[i]; i++)
		{
			var pattern;
			if (oFormEl.type == 'text')
			{
				switch (fieldTypes[oFormEl.id][ 0 ])
				{
					case 'int':
						pattern = /^(\-)?\d*$/;
						break;
					case 'float':
						pattern = /^(\-)?\d*((\.|\,)\d*)?$/;
				}
				if (!pattern.test(oFormEl.value)) message += '\n'+fieldTypes[oFormEl.id][ 1 ];
			}
		}
		if (message) alert('Неверно заполнены поля:'+message);
		else oForm.submit();
	}
</script>
<form>
	Целое число: <input id="t1" type="text"><br>
	Дробное число: <input id="t2" type="text"><br>
	<input type="button" onclick="check(this.parentNode)" value="отправить">
</form>

P.S. нестандартные параметры тегов (типа check_message="Целое!" check_pattern="I6") будут работать только в IE.
...
Рейтинг: 0 / 0
Плиз помогите по JS
    #35211255
chenosov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 illion
Огромное мерси за помощь. Попробую ваш вариант. Мой не работал, как оказалось из-за модификатора 'g', который стоял в примере :
Код: plaintext
1.
2.
3.
4.
5.
namepattern=/^[-]?[iIdD]\d{ 1 , 2 }([\.\,]+\d{ 0 , 2 }|)$/g;
alert(namepattern.test("I6")); //true
alert(namepattern.test("I6")); //false
alert(namepattern.test("I6")); //true
alert(namepattern.test("I6")); //false

Убрал и все поехало. Почему, кстати, не знаете?

illionP.S. нестандартные параметры тегов (типа check_message="Целое!" check_pattern="I6") будут работать только в IE.

Не, в FireFox работает, проверил
...
Рейтинг: 0 / 0
Плиз помогите по JS
    #35211642
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chenosov2 illion
Мой не работал, как оказалось из-за модификатора 'g', который стоял в примере :
Код: plaintext
1.
namepattern=/^[-]?[iIdD]\d{ 1 , 2 }([\.\,]+\d{ 0 , 2 }|)$/g;
Убрал и все поехало. Почему, кстати, не знаете?

Не знаю. Честно говоря, мой мозг отказывается осмысливать ваш пример. Где-то на середине возникает переполнение памяти, и приходится читать заново. Разе на третьем наступило зацикливание и процесс был прерван :-).
Кстати, почему вы экранируете слэш только в половине случаев? Например - "\\d{1," даст в итоге \d{1, , а вот "[\+\-]?" даст [+-]? . То же самое для "([\.\,]+\\d{0,". В итоге вы не получите валидное регулярное выражение.
P.S. Хинт: конструкция newpattern=newpattern+"строка" эквивалентна newpattern+="строка"

chenosov
illionP.S. нестандартные параметры тегов (типа check_message="Целое!" check_pattern="I6") будут работать только в IE.

Не, в FireFox работает, проверил
Мда? У меня подобное в ни в Опере, ни в FF не работает (по крайней мере в FF 2.0.0.4 и FF 2.0.0.11 - точно)
...
Рейтинг: 0 / 0
Плиз помогите по JS
    #35211825
chenosov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле все очень просто. У меня есть желание проверять валидность введённых данных на клиенте, задавая несложным образом формат данных.
Например,

-I6 означает, что должно быть введено целое число со знаком размерностью до 6 цифр.
D12.2 - десятичное число без знака с размерностью 12 знаков, и до 2 цифр после запятой (точки), бабки, к примеру.

Все что кажется вам диким, видимо таковым и является, т.к. знакомство с JS исчерпывается у меня 2 днями.

Кстати, функцию я все-таки сделал и подключил, работает нормально, добавил туда еще проверку формата e-mail.

Все это я делаю не от хорошей жизни. В программах PHP, которые у нас работают, сейчас можно ввести в цифровое поля "Дядя Вася" - программа все это сожрет и запишет в базу на Mysql 0, даже не выдав ошибки, такие настройки у сервера. Конечно, можно эту туфту отправить на сервер и там устроить проверку, но мне кажется этот путь нерациональным.
...
Рейтинг: 0 / 0
Плиз помогите по JS
    #35212005
Garry80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chenosovНа самом деле все очень просто. У меня есть желание проверять валидность введённых данных на клиенте, задавая несложным образом формат данных.
Например,

-I6 означает, что должно быть введено целое число со знаком размерностью до 6 цифр.
D12.2 - десятичное число без знака с размерностью 12 знаков, и до 2 цифр после запятой (точки), бабки, к примеру.

Все что кажется вам диким, видимо таковым и является, т.к. знакомство с JS исчерпывается у меня 2 днями.

Кстати, функцию я все-таки сделал и подключил, работает нормально, добавил туда еще проверку формата e-mail.

Все это я делаю не от хорошей жизни. В программах PHP, которые у нас работают, сейчас можно ввести в цифровое поля "Дядя Вася" - программа все это сожрет и запишет в базу на Mysql 0, даже не выдав ошибки, такие настройки у сервера. Конечно, можно эту туфту отправить на сервер и там устроить проверку, но мне кажется этот путь нерациональным.

Конечно можно, и не только можно но и нужно. Потому как не у всех пользователей включены скрипты. 100%-ной гарантии того что все давнные придут валидные все равно нет.
...
Рейтинг: 0 / 0
Плиз помогите по JS
    #35212009
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chenosovУ меня есть желание проверять валидность введённых данных на клиенте, задавая несложным образом формат данных.

В таком случае я вам предлагаю отказаться все-таки от вашей навороченной функции. Главный ее недостаток - даже не множество излишних операций, и не нечитабельность, и не бОльшее время исполнения, а трудность масштабирования. Через неделю вы решите, что неплохо бы еще и даты проверять, и что - отправитесь дописывать еще два километра кода?
Переделаю свой пример к вашей задаче:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
<script>
	var fieldTypes = {
		't1':['I6', 'Целое число','1'], 
		't2':['D12.2', 'Дробное число']
	};
	function check(oForm){
		var message = messageErr = messageNull = '';
		for (var i= 0 ; oFormEl = oForm.elements[i]; i++)
		{
			var pattern;
			if (oFormEl.type == 'text' && oFormEl.id && fieldTypes[oFormEl.id])
			{
			    if (!oFormEl.value && fieldTypes[oFormEl.id][ 2 ]) 
					messageNull += '\n' + fieldTypes[oFormEl.id][ 1 ];
			    else if (oFormEl.value)
			    {
					switch (fieldTypes[oFormEl.id][ 0 ])
					{
						case 'I6':
							pattern = /^(\-)?\d{ 1 , 6 }$/;
							break;
						case 'D12.2':
							pattern = /^(\-)?\d{ 1 , 12 }((\.|\,)\d{ 1 , 2 })?$/;
							break;
					}
					if (!pattern.test(oFormEl.value)) messageErr += '\n'+fieldTypes[oFormEl.id][ 1 ];
			    }
			}
		}
		if (messageErr) message += 'Неверно заполнены поля:' + messageErr;
		if (messageNull) message += '\nНе заполнены обязательные поля:' + messageNull;
		if (message) alert(message);
		else oForm.submit();
	}
</script>
<form>
	Целое число (обязательное): <input id="t1" type="text"><br>
	Дробное число: <input id="t2" type="text"><br>
	Все равно: <input type="text"><br>
	<input type="button" onclick="check(this.parentNode)" value="отправить">
</form>
Хэш fieldTypes состоит из строк вида 'id_элемента':'тип_поля','текст','ненулевое'. 'Текст' - в данном случае название поля, если поле обязательное то вместо 'ненулевое' указать '1', в противном случае можно не указывать. Новые типы добавляются путем вставки еще одного case и шаблона.

Почитайте о событиях onchange и onblur - они позволят проверять значения по ходу заполнения полей, а не в конце.

chenosov
Все это я делаю не от хорошей жизни. В программах PHP, которые у нас работают, сейчас можно ввести в цифровое поля "Дядя Вася" - программа все это сожрет и запишет в базу на Mysql 0, даже не выдав ошибки, такие настройки у сервера. Конечно, можно эту туфту отправить на сервер и там устроить проверку, но мне кажется этот путь нерациональным.
Крайне неправильный подход. Данные на стороне сервера проверять обязательно ! Иначе делаете систему серьезно уязвимой (клиентские проверки можно и обойти). Проверка на клиенте нужна для сокращения времязатрат на введение данных заново в случае неверно введенных данных.
...
Рейтинг: 0 / 0
Плиз помогите по JS
    #35212938
chenosov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это означает, что если мне понадобится в дополнению к D12.2 добавить D12.3 и D11.2 я должен менять код js процедуры. Не очень-то это удобно.

Код: plaintext
1.
Данные на стороне сервера проверять обязательно! Иначе делаете систему серьезно уязвимой (клиентские проверки можно и обойти). 
Проверка на клиенте нужна для сокращения времязатрат на введение данных заново в случае неверно введенных данных.

Согласен, но здесь я пойду немного другим путем - проверки в триггерах СУБД.
...
Рейтинг: 0 / 0
Плиз помогите по JS
    #35213135
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chenosovСогласен, но здесь я пойду немного другим путем - проверки в триггерах СУБД.
Не совсем правильный подход. Обработать там ты можешь нормально, а вернуть результат на страницу? А сообщение? - Все равно это работа сервера, зачем дополнительно грузить базу?
...
Рейтинг: 0 / 0
Плиз помогите по JS
    #35213976
chenosov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Обработать там ты можешь нормально, а вернуть результат на страницу? А сообщение?

Все это я уже знаю как делать, включая доступные русские сообщения.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Плиз помогите по JS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]