Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проверка неизвестного количества полей (https://javascript.ru/forum/misc/50544-proverka-neizvestnogo-kolichestva-polejj.html)

Lobezki 30.09.2014 19:31

Проверка неизвестного количества полей
 
Доброго времени суток! Выполняю проверку неизвестного количества полей. Проверяется только одно, первое поле,а остальные добавленные пользователем поля не проверяются((

var requiredFields = $('input[class="required"]');
	var	requiredFieldsSize = requiredFields.size();
	var isRequiredFieldsSize = 0;
	var submit = $("#cartgivebookbtn");
		   
	requiredFields.focus(function(e) {
		$(this).removeClass('error');
		submit.attr('disabled', false);
	});
	 
	submit.mousedown(function(){
		   
			requiredFields.each(function() {
		   
					if($.trim(this.value) != '')
					isRequiredFieldsSize++;
					else
					$(this).addClass('error');
	 
			}); // requiredFields.each
	 
			if(isRequiredFieldsSize < requiredFieldsSize)
			{
					alert('Заполнены не все обязательные поля!');
					$(this).attr('disabled', true);
					return false;
			}
	});


<p><label for="books"><input style="width: 110px" type="text" name="books[]" class="required" id="if1" maxlength="8"/></label></p>

danik.js 30.09.2014 21:00

Используй html5 атрибут required. Все будет работать без js.
Для старья типа IE8 - серверная валидация, которая нужна в любом случае.

danik.js 30.09.2014 21:02

Можешь полифил поискать для required. Я обычно использую webshims - но это целый комбайн, не уверен что его стоит всюду втыкать.

Lobezki 30.09.2014 22:15

danik.js,
Спасибо! Вообще не хотел на 5-ку уходить. Но тут реально очень кстати. 50 строк скрипта можно не писать, всего лишь из-за добавления одного параметра. Надеюсь сильно жестких изменений нет и проект не прийдёться переписывать под 5-ку.

danik.js 30.09.2014 22:19

Цитата:

Сообщение от Lobezki
Надеюсь сильно жестких изменений нет и проект не прийдёться переписывать под 5-ку

Что это значит?

kostyanet 01.10.2014 00:26

Цитата:

Сообщение от Lobezki
Выполняю проверку неизвестного количества полей

Это называется выполняю абстрактную проверку. Когда валидатор проверяет вообще, по доступным критериям, а не конкретно нарисованную для него форму.

Чтобы вообще проверять поле должно иметь те самые критерии. required, maxlength, multiple, pattern. В паттерны пишутся соответственно реги. Теоретически html5-ная форма сама способна все проверить если все правильно заколотить ей.

Но практически получается какая-то хрень. Мало того что с этими регами одуреешь (это ж только специальные люди знают такой язык), так еще браузеры по-разному реагируют и еще файлы.

Регой можно проверить максимальный размер файла или максимальное их количество? А если все равно писать скрипт - то уже все равно приходится отключать автовалидацию, ибо она неуправляема из скриптов.

Ну вот, я как-то рассказывал что перечисленные индикаторы можно юзать как параметры. Пишите в required=3 - значит скрипт скажет "меньше 3 нельзя". maxlength и так понятно - для текстов это длина текста, для файлов - килобайты, multiple=5 - не больше 5.

ЗЫ И еще куча новых полей браузерами до сих пор не поддерживается.

kostyanet 01.10.2014 00:29

Цитата:

$(this).attr('disabled', true);
В ФФ если единственная кнопка задисаблена, форму нельзя отправить вообще, даже скриптом. Кросафчеги.

Lobezki 03.10.2014 14:10

kostyanet, что-то вы из мухи слона сделали. Проблема решена. Всё равно, как сказал danik.js на сервере надо данные проверить, а в браузере - это чисто для удобства пользователя.

kostyanet 04.10.2014 17:46

Это вы из мухи слона надули. Потому что хтмл идет из сервера, или из мозга Жанны Агузаровой? Если первое то значит сервер уже должен знать, ну скрипт тамошний, про все эти поля неизвестные заранее - иначе каким членом он их проверит в тех же условиях? Следовательно когда скрипт 1 делает хтмл, то скрипт 2 должен как-то разобраться что там наворотил скрипт 1. Но не парсить же хтмл - значит данные поступают нормализованные. Так вот, из этих нормализованных данных и делается нормальный хтмл со всеми этими атрибутами и ява-скрипту делать-то ничего не надо: взял поле, взял параметры, взял шаблон - посчитал - не равно - пометить красным. А вы думаете как вообще работает встроенная в HTML5 валидация? Из мозга Жанны Агузаровой что ли берет красную рамку?

kostyanet 04.10.2014 17:49

<label>Адрес электронной почты</label>
<input type="email" name="formfield[1]" placeholder="email@example.com" maxlength="50" pattern="^[^\s@]+@[^\s@]+\.[^\s@]+$" required="5"/>


Все берется из атрибутов. В первую очередь метод валидации, например

validator['validate_'+field.type].call();

validate_email:function() {
 // бла-бла-бла
},


На сервере:

Код:

$fields('email')
        ->type('email')
        ->label('Адрес электронной почты')
        ->placeholder('email@example.com')
        ->maxlength(50)
        ->pattern()
        ->required(5);

Совпадение имени поля с типом значения не имеет, просто в бд оно так и называется имейл. Проперть pattern пустая, потому что рега имейла относится к вечным и смысла ее каждый раз прописывать нет. В классе есть метод который достает из массива регу по ключу имейл и втыкает в проперь по признаку имени проперти - pattern. Но если нужен особый для конкретного случая -

Код:

$fields('image')
        ->type('file')
        ->label('Загрузка файла')
        ->maxlength(200)
        ->multiple(3)
        ->sub_label(' (максимум: '.$fields->image->multiple
        .' по '.$fields->image->maxlength.'Кб, '.($types='jpg,jpeg,png,gif').')')
        ->pattern($types)
        ->accept('image/*');

и рендер его впихнет в атрибут автоматически. Таким образом достигается цель - хранить факт в одном месте.

Но, блин, с файлами облом. Кроме типов файлов (тупой accept же берет все подряд) надо еще проверять имя файла - а для второго паттерна места уже нет.


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