Почему javascript проваливает проверку когда много условий?

И снова здравствуйте :)
имеем элементарный скриптик проверки заполненности формы:
function car_validate(form) {
	valid = true;
	if (form.var1.value.length < 2) {
		document.getElementById('var1_e').innerHTML='err1';
		valid = false;
	}
	if (form.var2.value == 0) {
		document.getElementById('var2_e').innerHTML='err2';
		valid = false;
	}
	if (form.var3.value == 0) {
		document.getElementById('var3_e').innerHTML='err3';
		valid = false;
	}
	if (form.var4.value == 0) {
		document.getElementById('var4_e').innerHTML='err4';
		valid = false;
	}
	return valid;
}

который несмотря на незаполненные поля пропускает (проще говоря - не работает)
Но если убрать любое одно условие - то он начинает работать :)

Может кто подскажет в чём дело? Или кинется готовым вариантом проверки на именно на JS

P.S. да, да, я в курсе про jQuery, и пр., но не настолько большой сайт, что бы подключать что-то ради проверки одной формы + сторонние ссылки не хотелось бы подключать (используется SSL для доступа к сайту)
  • Вопрос задан
  • 2464 просмотра
Решения вопроса 1
GM2mars
@GM2mars
Проверьте сравниваемые значения одинакового ли типа. Если в форме только числа, то желательно явно указывать parseInt(form.var4.value)==0
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
DeLaVega
@DeLaVega
Верстаю, фронтэндю =)
Ну для начала объявите переменную:
var valid = true;

И вы в каждом условии переменную переопределяете. Соответственно, если у вас все первые были false, а последняя true, то и результат будет - true.
Ответ написан
Prognosticator
@Prognosticator
TODO: Здесь будут ворованные умные мысли, типа мои
Переходите на светлую сторону Html5, с его "required" и типами полей :)
Ответ написан
madmages
@madmages
Человек прямоходящий
мне кажется скрипт просто падает в виду того что вы просите у него свойства у объекта который не объявлен
Ответ написан
lexxpavlov
@lexxpavlov
Программист, преподаватель
Если у вас в элементах var2-var4 записаны числа, то тип данных всё равно строка, и для сравнения с нулём нужно преобразовать строку в число. Либо как сказал @GM2mars, только в его примере лучше указать вторым параметром систему счисления: parseInt(form.var4.value, 10) === 0, потому как в старых браузерах числа, начинающиеся с нуля ("012"), считались восьмеричным числом. Либо просто указать +form.var4.value === 0, где унарный плюс переведёт строку в число.
А само присвоение valid = false в данном случае корректно.
Но я обычно делаю так:
function validate(form) {
  var errors = [];
  if (form.var1.value.length < 2) errors.push('length');
  if (+form.var2.value == 0) errors.push('var2');
  if (+form.var3.value == 0) errors.push('var3');
  if (+form.var4.value == 0) errors.push('var4');
  showErrors(errors);
  return errors.length == 0;
}
function showErrors(errors) {
  foreach (error in errors) {
    switch (errors[error]) {
      case 'length': document.getElementById('var1_e').innerHTML='err1'; break;
      case 'var2': document.getElementById('var2_e').innerHTML='err2'; break;
      case 'var3': document.getElementById('var3_e').innerHTML='err3'; break;
      case 'var4': document.getElementById('var4_e').innerHTML='err4'; break;
    }
  }
}

Такой подход позволяет разделить собственно проверку значений и обработку ошибок.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы