Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Грамотная валидация формы (https://javascript.ru/forum/dom-window/40329-gramotnaya-validaciya-formy.html)

seniormelikyan 01.08.2013 01:19

Грамотная валидация формы
 
Люди, помогите, пожалуйста :help: Никак не могу реализовать нормальную валидацию формы. Есть 4 поля: "Имя", "E-mail", "Тема", "Сообщение". Как реализовать проверку на их заполнение, чтобы выводилось сообщение о том, какие(-ое) поля(-е) не заполнены(-о) вообще, а какие(-ое) - не соответствуют(-ет) регулярным(-ому) выражениям(-ю)?

Регулярные выражения для полей имеются:

1: /^[А-Яа-яЁё]+$/ - "Имя" - одно слово на русском в любом регистре
2: <input type="email"> - "E-mail" - подскажите, пожалуйста, если есть что-то лучше
3, 4: /^[А-Яа-яЁё\W\s\d]+$/ - "Тема", "Сообщение" - все, что угодно, но только на русском

ruslan_mart 01.08.2013 05:02

seniormelikyan, обычно такое проверяют на стороне сервера.

ksa 01.08.2013 08:46

Цитата:

Сообщение от seniormelikyan
Никак не могу реализовать нормальную валидацию формы.

В чем именно проблема?

seniormelikyan 01.08.2013 11:05

Проблема - в том, что не получается реализовать проверку каждого условия, а не какого-то конкретного в отдельности. Мне нужно, чтобы форма не отправлялась, пока не будут соблюдены все условия. Вот мой код: Сейчас, если все поля пусты, при нажатии на кнопку "Отправить", в поле ошибки выводится "Введите свое имя на русском языке...", хотя я ожидаю "Заполните все поля". Я запутался в своих же условиях. В общем, никак я этой форме ума не дам.

window.onload = function() {

form = document.forms[0],
fields = form.getElementsByTagName('input'),
msg = form.getElementById('required'),
regExp = /^[А-Яа-яЁё\W\s\d]+$/;

form.onsubmit = function(event) {

for (var i = 0; i < fields.length; i++) {

if (!fields[i].value) {
event.preventDefault();
fields[i].className = 'invalid';
msg.innerHTML = 'Заполните обязательные поля';
}

else
fields[i].className = "";

if (fields[0].value.search(/^[А-Яа-яЁё]+$/)) {
event.preventDefault();
msg.innerHTML = fields[0].title;
fields[0].className = 'invalid';
}

else if (fields[2].value.search(regExp)) {
event.preventDefault();
msg.innerHTML = fields[2].title;
fields[2].className = 'invalid';
}

else if (fields[3].value.search(regExp)) {
event.preventDefault();
msg.innerHTML = fields[3].title;
fields[3].className = 'invalid';
}

}
}
}

seniormelikyan 01.08.2013 11:07

А если сделать проверку, включен ли Javascript, и, если нет, вывести сообщение об ошибке с ссылкой на Google Help по включению Javascript и не пустить пользователя никуда, пока он его не включит? Можно, конечно, и на стороне сервера повозиться, но мне кажется, что такой вариант тоже вполне себе приемлем. Я прав?

seniormelikyan 01.08.2013 11:08

Кто-нибудь может мне помочь?

zilker 01.08.2013 23:40

<style>
	input[type="text"], input[type="email"] {
		width: 100px;
	}
	.invalid {
		background: red;
	}
</style>

<form id="test">
	<input type="text" title="имя"></input>
	<input type="email" title="email"></input>
	<input type="text" title="тема"></input>
	<input type="text" title="сообщение"></input>
	<span id="required"></span><br>
	<input type="submit" >
</form>

<script>
window.onload = function() {

	var	form = document.forms[0],
			fields = form.querySelectorAll('input[type="text"], input[type="email"]'),
			msg = document.getElementById('required'),
			regExp = [/^[А-Яа-яЁё]+$/, /.+@.+\..+/i, /^[А-Яа-яЁё\W\s\d]+$/, /^[А-Яа-яЁё\W\s\d]+$/];

	form.onsubmit = function(event) {
		var valid = true, cnt = 0;
		
		event.preventDefault();
		
		Array.prototype.forEach.call(fields, function(input) {
			input.classList.remove('invalid');
			if(!input.value.length) {
				cnt++;
			}
		})
		
		if(cnt == fields.length) {
			Array.prototype.forEach.call(fields, function(input) {
				input.classList.add('invalid');
			})
			msg.innerHTML = 'Заполните обязательные поля!';
			return;
		}		
		
		for (var i = 0, l = fields.length; i < l; i++) {
			fields[i].classList.remove('invalid');
			if(!fields[i].value.match(regExp[i])) {
					fields[i].classList.add('invalid');
					msg.innerHTML = 'Неверно введено поле ' + fields[i].title + '!';
					valid = false;
					break;
			}
		}
		
		if (valid) {
			form.submit();
		}
		
	}
}
</script>

seniormelikyan 03.08.2013 02:37

Большое спасибо :)


Часовой пояс GMT +3, время: 07:34.