@timtimIT

Почему не работает следующий код?

Подскажите, почему не работает следующий код ? в разработчике ошибок нет. Нужно выводить "введите имя" при нажатии на кнопку если имя не было введено... Оно выводит постоянно...
Изучаю javascript.
Спасибо.
<body>
	
	<form action="">
		<ul>
			<li><label for="name" id="name1">name:</label><input type="text" id="name"></li>
			<li><label for="surname">Фамилия:</label><input type="text" id="surname"></li>
			<li><label for="phone">Телефон:</label><input type="text" id="phone"></li>
			<li><label for="email">Электронная почта:</label><input type="text" id="email"></li>
			<li><label for="info">Дополнительная информация:</label><textarea name="" id="info" cols="30" rows="10"></textarea></li>
			<li><button onclick="NameValidate()">Отправить</button></li>
		</ul>
		<p id="par"></p>
	</form>
	
	
	
	<script>
	
	var str = document.getElementById("name").value ;
	
	function NameValidate(){
	
	if (str == ''){
	alert("Введите имя!");
	}
	}
	
	
	
	
	</script>
	
	
</body>
  • Вопрос задан
  • 197 просмотров
Решения вопроса 1
mannaro
@mannaro Куратор тега JavaScript
Умею профессионально гуглить
Не работает потому, что простые объекты передаются не по ссылке, а значением. Вкратце:
// ты инициализируешь переменную str сразу после загрузки DOM
// на данный момент она равна пустой строке
var str = document.getElementById("name").value;

// ты инициализируешь функцию
function NameValidate() {
  // пытаешься получить значение переменной str
  // так как она передалась значением, то сама по себе она не изменяется
  // и до сих пор равна пустой строке
  if (str == ''){
    // а это значит, что все работает правильно
    alert("Введите имя!");
  }
}

Если же мы хотим избежать подобной ситуации, то нам необходимо либо сделать функцию для извлечения этой переменной, либо передавать ее родительский объект.
// input - объект, который передан по ссылке
var input = document.getElementById("name");
function NameValidate() {
  if (input.value == ''){
    alert("Введите имя!");
  }
}

или:
// str - функция, вытаскивающая свойство из объекта
var str = function() {
  return document.getElementById("name").value;
};

function NameValidate() {
  if (str() == ''){
    alert("Введите имя!");
  }
}

или:
function NameValidate() {
  // вытаскиваем значение сразу после клика
  // минус - повторный поиск элемента в дереве DOM
  // каждый раз при клике на кнопку
  var str = document.getElementById("name").value;
  if (str == ''){
    alert("Введите имя!");
  }
}

Респект тебе, что изучаешь JS не вникая в jQuery. А то сейчас столько народу, что и не скажут тебе, что делает getElementById :)
Также, совет: не пиши str == '' Достаточно писать просто if(str)
Это работает потому, что в JS любой тип можно привести к булеву значению. Пустая строка, undefined, null и 0 - это все false. Остальное - true.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Респект однозначный за изучение!
Просто вносим строку получения текущего значения name внутрь функции (для отработки по "клику"):
function NameValidate() {
  var str = document.getElementById("name").value;
////// тело функции....................
}

Добавлю, что NameValidate() лучше заменить на FormValidate(this.form) и полученную форму проинспектировать на все поля перед отправкой.
Ответ написан
Ваш ответ на вопрос

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

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